2016-01-21 39 views
0

在下面的銀行代碼,對於某些類型T:HasDefaultValues,在init(variableValue: T)的分配不會發生和成員variable採取的T.defaultValue值:爲什麼Swift中的任務不會發生?

protocol HasDefaultValues : Equatable { 
    static var defaultValue: Self {get} 
    static var alternativeValue: Self {get} 
} 

class MyClass<T:HasDefaultValues> : NSObject, NSCoding { 
    var variable: T = T.defaultValue 

    init(variableValue: T) { 
    self.variable = variableValue // Executed, but assignment doesn't happen! 
    super.init() 
    } 

// ... More code follows 
} 

使用調試器我有單步的代碼,並確認variableValue的值與預期的一樣,即執行通過self.variable = variableValue分配,但self.variable的值不會更改。該代碼按照預期爲許多其他類型T:HasDefaultValues。可能這是一個編譯器錯誤?

沒有進行賦值的類型爲T:HasDefaultValues的代碼非常複雜,我沒有試圖將事物減少到最小可重現的例子。我在這裏問的是,除了編譯器錯誤之外,是否有充分的理由讓一個簡單的任務失敗。如果有的話,這將有助於將事物減少到一個最小可重現的例子。

在此先感謝。

+2

請向我們展示一個可驗證的工作示例,以便我們可以爲您驗證此行爲。也就是說,你應該能夠包含一個符合'MyClass'中'NSCoding'的縮小示例,以及一些擴展和符合'HasDefaultValues'類型的'MyClass'的簡單示例用法。 – dfri

+1

如果你不打算在代碼的生命週期中改變它,你可以聲明你的變量爲'let',這會給你更多的源代碼的穩定性。 – Cristik

+0

@Cristik當'variable'被設置爲默認初始值時,如果聲明爲不可變變量('let'),它在初始化器中不會變化。 – dfri

回答

2

我認爲一些代碼正在改變variable屬性。

請添加一個觀察者來檢查這個「理論」。

var variable: T = T.defaultValue { 
    didSet(oldValue) { 
     debugPrint("variable changed from \(oldValue) to \(variable)") 
    } 
} 
+1

非常感謝。 'variable'屬性沒有被別的東西重新設置,但是使用'didSet'的建議真的很有幫助。我還沒有弄清楚究竟發生了什麼,但我現在有更多的信息。 – Chris