2015-04-17 113 views
2

作爲一名自學,或者說是教過的程序員,我一直在想,當你設置一個變量或一個let時,實際上會發生什麼。今天,我得到了@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 
} 

但我注意到,它實例2個viewControllers,即使邏輯將只需要一個。我經常看到這一點。我們實例化永遠不會使用的變量,而不是在需要時使用。我們爲什麼要做這個? 它是否對性能沒有影響,或者它是如此之小以至於我們這樣做,因爲人類是人類,它可能使代碼更清晰一些?

+2

只是爲了讓你知道:還有一個模式稱爲延遲初始化。不要一次創建所有對象,而是嘗試延遲初始化直到真正需要對象。 [鏈接](http://en.m.wikipedia.org/wiki/Lazy_initialization) – Duc

+0

@Duc我注意到你不能懶惰的讓,只有懶惰的變種。爲什麼?我得到的印象是,讓我們比var的成本更低,所以最好讓我們還是懶惰的var?也許這是一個愚蠢的問題/評論.. – KML

+0

「我注意到你不能懶惰,只有懶惰var」這是一個已知和令人遺憾的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聲明; Swift知道boolForKey會產生一個Bool。

相關問題