2015-04-17 4 views
2

Как преподаватель, или, скорее, преподаватель, программист, я некоторое время размышлял над тем, что на самом деле происходит, когда вы устанавливаете переменную или пусть. Сегодня мне очень понравилась @Cocoadelica помощь в настройке шаблона для пользователей. Мы остановились на этом решении:Создание - что он делает?

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let isOnboarded:Bool = NSUserDefaults.standardUserDefaults().boolForKey("Onboarded") 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    // instantiate your desired ViewController 
    let dashboardViewController = storyboard.instantiateViewControllerWithIdentifier("DashboardVC") as! UIViewController 
    let onboardingViewControllerOne = storyboard.instantiateViewControllerWithIdentifier("OnboardingVCOne") as! UIViewController 

    let window = self.window 

    if (isOnboarded) { 
      window!.rootViewController = dashboardViewController 

     }else{ 
      window!.rootViewController = onboardingViewControllerOne 
    } 

    return true 
} 

Но я заметил, что она конкретизирует два viewControllers, даже если логика будет нужен только один. Я вижу это довольно часто. Мы создаем переменные, которые никогда не будут использоваться, а не когда они понадобятся. Почему мы это делаем? Не влияет ли это на производительность, или она настолько мала, что мы делаем это независимо от того, что люди - люди, и это делает код более понятным, возможно?

+2

Просто, чтобы сообщить вам: есть также шаблон, называемый ленивой инициализацией. Вместо того, чтобы создавать все объекты одновременно, попробуйте отложить инициализацию до тех пор, пока объект не понадобится. [link] (http://en.m.wikipedia.org/wiki/Lazy_initialization) – Duc

+0

@Duc Я заметил, что вы не можете делать ленивый, пусть только ленивый var. Зачем? И у меня сложилось впечатление, что давайте будем менее дорогостоящими, чем var, Итак, что лучше, давайте или lazy var? Возможно, это глупый вопрос/комментарий .. – KML

+0

«Я заметил, что вы не можете лениться, пусть только ленивый вар» Это известное и прискорбное ограничение Swift, которое, я надеюсь, в конечном итоге будет преодолено. В то же время это не сложно реализовать сами, как я продемонстрирую в своей книге: http://www.apeth.com/swiftBook/ch03.html#EXlazy – matt

ответ

3

Мы делаем это независимо от того, что люди - люди, и это делает код более понятным, возможно?

Точно так, но теперь давайте поговорим о «стоимости». Экземпляр контроллера представления сам по себе является легким объектом. И тот, который не сохраняется, назначив его rootViewController, будет автоматически уничтожен, когда этот метод вернется, а часть миллисекунды позже.

Да, это пустая трата экземпляра, но отходы являются крошечными и, вероятно, не стоит беспокоиться об этом в этой ситуации.

Тем не менее, это не лучший стиль в мире, на мой взгляд; Я согласен с вашим первоначальным подозрением, что мы не должны создавать экземпляр вообще, если нам это не нужно. И могут быть ситуации, когда инстанцирование дорого! Так что лично я бы переписать, как это, и я подозреваю, вы бы тоже:

let window = self.window 
if (isOnboarded) { 
    let dashboardViewController = storyboard.instantiateViewControllerWithIdentifier("DashboardVC") as! UIViewController 
    window!.rootViewController = dashboardViewController 
} else { 
    let onboardingViewControllerOne = storyboard.instantiateViewControllerWithIdentifier("OnboardingVCOne") as! UIViewController 
    window!.rootViewController = onboardingViewControllerOne 
} 

Кстати, есть много других глупой вещи в этом фрагменте кода, так что я бы не стал считать, как много из модель для чего угодно, если бы я был вами. Например, строка let window = self.window не делает ничего полезного и может быть полностью опущена. И нет необходимости в явной декларации Bool; Свифт знает, что boolForKey дает Bool.

Смежные вопросы