2016-03-22 53 views
2

編輯:發生這種情況是因爲我通過可選鏈接的屬性和/或方法訪問SomeArrayWrapper實例。我已更新我的示例。替換C範圍運算符 - 分段錯誤:11當使用w /?鏈接

我今天上午有一個問題,將項目更新到Swift 2.2。

這是什麼,我有一個例子:

//wraps an array 
class SomeArrayWrapper<T> { 

    var privateArray = [T]() 

    // returns count from private array 
    var count: Int { get { 

     return self.privateArray.count 
     } 
    } 
} 

class SomeClass { 

    var list: SomeArrayWrapper<Int>? 
} 

let someInstance = SomeClass() 

// Somewhere else I need to use this like this: 
let myArrayType = SomeArrayWrapper<Int>() 

for var i = 0; i < someInstance.list?.count; i++ { 

// Do things. 
} 

// Replacing the C style loop with: 
for i in 0..<someInstance.list?.count { 


} 
// Reults in a segmentation fault 11 at compile time. 

我經歷這種變化作爲一個警告的C循環的結果。我沒有將我的自定義結構符合序列或集合(我不確定這是否與它有關)。

這是一個Swift 2.2的bug還是我做錯了?

+0

對我來說它的工作原理... – user3441734

+0

@ user3441734我發現它通過使用可選鏈的東西來使用遊俠操作符。 –

+0

@thefredelement您應該將您的解決方案作爲_answer_發佈到您自己的問題上,而不是作爲對問題本身的修改。這可以幫助別人。回答你自己的問題是合法的,並鼓勵Stack Overflow;在48小時內,你甚至可以接受你自己的答案(當然,沒有這樣做的代表點) – matt

回答

2

儘管你的解決方案force-unwrapping Optional可以「工作」(從它可以防止段錯誤的意義上來說),但是在大多數情況下,要花費時間和麻煩來解開可選安全?就像這樣:

if let count = someInstance.list?.count { 
    for i in 0..<count { 
     // ... 
    } 
} 

由於Sulthan已經指出的那樣,你可以表達更整齊地通過使用導致循環不發生默認值:

for i in 0..<(someInstance.list?.count ?? 0) { 
    // ... 
} 
+0

我同意,在我的情況下,我警惕財產不是先零,然後強行解開它的循環。 –

+0

他在編譯時遇到了段錯誤11 ...我無法重複他的麻煩 – user3441734

+0

我可以重現有趣的段錯誤@ user3441734 – matt