2016-09-25 147 views
1

为什么我就不能绕过的bc初始化下面的代码:可选和默认值需要用默认初始值进行初始化

struct Token { 
    var a: Int 
    var b: Int = -1 
    var c: Int? 
} 

let t1 = Token(a: 1, b: 2, c: 0) // works of course 
let t2 = Token(a: 1) // doesn't work :-(

我发现的唯一的方法是添加一个init在该struct,唯一的强制性参数:

init(a: Int) { self.a = a } 

但我发现这个语言的要求非常繁琐,太冗长。有没有办法实现初始化必填字段只有而不添加构造函数?

+0

相关:https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md(已被推迟)。 –

回答

2

您可以通过多种方式

Token(a: 1) // (1, -1, nil) 
Token(a: 1, b: 2) // (1, 2, nil) 
Token(a: 1, c: 3) // (1, -1, 3) 
Token(a: 1, b: 2, c: 3) // (1, 2, 3) 

通常是一个很好的做法写的默认值一些PARAMS

struct Token { 
    var a: Int 
    var b: Int 
    var c: Int? 

    init(a: Int, b: Int = -1, c: Int? = nil) { 
     self.a = a 
     self.b = b 
     self.c = c 
    } 
} 

现在你可以创建定义与默认值的初始化令牌一个属性在它定义的同一行上(如你所做的那样)。我将默认值b从它的定义移到init,只是为了缩短这个例子。

+0

我接受了这个答案,因为迄今为止,这是解决这个限制的唯一方法。我阅读了这个提案,我想知道为什么提议的设计很复杂。更简单和更吸引人的方式应该是将默认构造函数调整为仅需要所需的值。当它最终到来时,会等待额外的语法糖。谢谢。 – Laurent