2016-08-04 90 views
1

看着斯坦福大學iOS 9課程here的演講幻燈片,他正在創建一個帶有兩個初始化程序的新的UIView(其中一個如果UIView是從storyboard創建的,另一個是如果它是在代碼中創建的)。下面的代碼是在那個特定的幻燈片的底部寫着:在其超類初始化後初始化UIView init?

func setup() {....} //This contains the initialization code for the newly created UIView 

    override init(frame: CGRect) { //Initializer if the UIView was created using code. 
     super.init(frame: frame) 
     setup() 
    } 
    required init(coder aDecoder: NSCoder) { //Initializer if UIView was created in storyboard 
     super.init(coder:aDecoder) 
     setup() 
    } 

的規則是,你必須初始化所有自己的屬性之前,首先你可以抓住從超一個init。那麼爲什麼在這種情況下,他在他初始化自己setup()之前稱他的超類init super.init?這與以下規則不矛盾:

安全檢查1指定的初始化程序必須確保在其委託給超類初始化程序之前,它的類所引入的所有屬性都將被初始化。

如上所述,一旦所有存儲屬性的初始狀態已知,對象的存儲器僅被視爲完全初始化。爲了滿足這個規則,一個指定的初始化器必須確保所有的屬性在它傳遞鏈之前被初始化。

回答

0

我還沒有看到代碼的其餘所有在這個例子中,但規則是隻有你的屬性必須被初始化(即它們佔據的內存必須設置一些初始值)之前調用super.init(),而不是你不能運行額外的設置代碼。

你甚至可以通過聲明你的屬性lazy var或使用var選項自動初始化爲nil,從而不會真正初始化你的屬性。您可以在撥打super.init()後再設置它們。

例如:

class Foo: UIView { 
    var someSubview: UIView! // initializes automatically to nil 

    lazy var initialBackgroundColor: UIColor? = { 
     return self.someSubview.backgroundColor 
    }() 

    init() { 
     super.init(frame: .zero) 
     setup()   // do some other stuff 
    } 

    func setup() { 
     someSubview = UIView() 
     someSubview.backgroundColor = UIColor.whiteColor() 
     addSubview(someSubview) 
    } 
}