2015-03-25 63 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