2016-09-25 191 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