#objective-c #scope #singleton #swift
#objective-c #область применения #синглтон #swift
Вопрос:
Я пытаюсь переключить одно из моих приложений с Objective-C на swift. В языке swift есть некоторые вещи, которые я не могу заставить работать. Прежде всего, у меня есть Model
класс, который я инициализирую в AppDelegate didFinishLaunchingWithOptions
. Я объявляю объект Model
‘s в .h
файле в Objective-C следующим образом:
@property(nonatomic,retain)Model *model;
В didFinishLaunchingWithOptions
я инициализирую его:
self.model=[[Model alloc]init];
И тогда у меня есть следующий метод:
(Model *)getCurrentModel{
AppDelegate *appdelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;
return appdelegate.model;
}
И тогда я могу получить доступ к текущему экземпляру Model
из любого класса, вызвав:
model = [AppDelegate getCurrentModel];
Итак, первый вопрос, как я могу сделать то же самое в Swift? Особенно статические функции (функция, которая начинается с
). Я пробовал это:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var model : Model?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
// Override point for customization after application launch.
model = Model()
return true
}
class var currentModel : Model {
struct Static {
static let instance : Model = AppDelegate.sharedApplication.delegate //error AppDelegate.Type does not have a member named sharedApplication
}
return Static.instance.model
}
Второй вопрос. В Objective C мы можем создать переменную экземпляра, глобальную переменную и глобальную функцию, объявив в .h
файле следующим образом:
@interface ViewController : UIViewController {
//Instance Variables
NSString *aName;
}
//Properties or variables that can be accessed globally
NSString *anotherName;
//Methods that have global scope
- (void)doSomething;
@end
Те функции, которые не объявлены в .h
файле, имеют локальную область видимости. Как мне сделать то же самое в Swift?
Комментарии:
1. Используйте
static
ключевое слово для объявления функций класса. В Swift нет концепции модификаторов доступа (по крайней мере, на данный момент). Все, что вы объявляете, является общедоступным.2. Что насчет ошибки, которую я получил? Совместное приложение?
Ответ №1:
sharedApplication
является методом UIApplication
, а не of AppDelegate
. Кроме того, вы должны развернуть необязательное для затем возвращаемое значение:
class var currentModel : Model {
struct Static {
static let instance = UIApplication.sharedApplication().delegate as AppDelegate
}
return Static.instance.model!
}
Комментарии:
1. Да, понял, спасибо. На самом деле я редактировал повсюду, чтобы найти решение, и забыл это изменить. Только сейчас заметил это.