Objective C и Swift

#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. Да, понял, спасибо. На самом деле я редактировал повсюду, чтобы найти решение, и забыл это изменить. Только сейчас заметил это.