2015-03-25 67 views
0

在迅速的,我有以下代碼:在swift中,當一個屬性沒有默認值時,其他屬性保留的默認值變得無用?

struct Person { 
    var name: String 
    var nose: Int = 1 
} 

var mike = Person(name: "mike", nose: 1) 
var john = Person(name: "john") //error: missing argument for parameter 'nose' in call 

雖然鼻子有一個默認值,我要爲它指定一個值。我的問題是,鼻子的默認值是否完全無用,我可以簡單地將聲明寫成如下所示?

struct Person { 
    var name: String 
    var nose: Int 
} 

謝謝!

回答

3

雨燕編程語言

結構類型自動接收按成員初始化,如果他們 不定義任何自己定製的初始化方法。即使 如果結構的存儲屬性沒有默認值,情況也是如此。

成員初始值設定項是初始化新結構實例的成員 屬性的簡寫方法。新實例的 屬性的初始值可以按名稱傳遞給成員設計的 初始值設定項。

由於您尚未爲您的結構聲明任何初始化程序,唯一可用的初始化程序是成員初始程序。

您可以聲明一個僅使用名稱的初始化程序,以便使用nose的默認值。這就需要你顯式聲明按成員初始化器 -

struct Person { 
    var name: String 
    var nose: Int = 1 

    init(_ name:String) { 
     self.name=name; 
    } 

    init (name:String, nose:Int){ 
     self.name=name; 
     self.nose=nose; 
    } 
} 


var mike = Person(name: "mike", nose: 1) 
var john = Person("john") 
2

我喜歡這種形式,因爲它是非常靈活:

struct Person { 
    var name: String 
    var nose: Int 

    init(name: String = "Anon", nose: Int = 1) { 
     self.name=name; 
     self.nose=nose; 
    } 
} 


var sally = Person(nose: 2, name: "Sally") 
var anon1 = Person(nose: 1) 
var anon2 = Person() 
var mike = Person(name: "mike", nose: 1) 
var john = Person(name: "john") 

注5種不同的初始化器的組合可能。從本質上講,它可以讓你像對待人員一樣對待Person(Builder模式)。

+0

另一個偉大的答案!謝謝! – nut 2015-03-25 05:34:27