2016-09-30 92 views
3

將此Objective-C代碼轉換爲Swift的正確方法是什麼?雖然在swift中賦值

while ((size = [inputdata readWithByteArray:buf]) != -1) { 
    //... 
} 

我需要與此類似(from here):

while let super = view?.superview { 
    count++ 
    view = super 
} 

但對我來說,我必須值與-1而不是nil比較。

回答

4

可以使用while case用結合模式加上一個布爾條件:

// Swift 3 (Xcode 8): 
while case let size = inputdata.readWithByteArray(&buf), size != -1 { 
    // process data 

} 

// Swift 2 (Xcode 7.3.1): 
while case let size = inputdata.readWithByteArray(&buf) where size != -1 { 
    // process data 

} 

(以前的答案:)一個直觀的實現會看起來像這樣:

var size = inputdata.readWithByteArray(&buf) 
while size != -1 { 
    // process data ... 

    size = inputdata.readWithByteArray(&buf) 
} 

如果代碼複製打擾你那麼你也可以把它寫成 (SWIFT 3/Xcode的8只):

var size: Int 
while (size = inputdata.readWithByteArray(&buf), size).1 != -1 { 
    // process data 

} 

這裏(...).1表達式評估爲所述第二元組元素, 即size,和第一個元組元素僅針對其副作用 進行評估。 (這是可能的斯威夫特因爲 從計算的表達式從左向右,在https://forums.developer.apple.com/thread/20001#63783由克里斯·拉特納 說明。)

+1

'.1'是什麼意思? – Vyacheslav

+0

@Vyacheslav:我想我已經找到了一個更好的解決方案,請參閱更新。 –

+2

10x。但用'.1'值保存答案。這是相當有趣的實現,imo。 – Vyacheslav

0

Swift 3.0中沒有++;可以更換i到你的病情

var i = 10 
while i != -1 { 
    print("----") 
    print(i) 
    i -= 1 
} 
+0

僅供參考 - 'I = I-1'被更好地寫成'我 - = 1'。這是取代'i - '的更明確的方法。 – rmaddy

+0

thx,我會告訴你 – Stark

1

,我發現,接受的答案了基於元組的代碼很有趣的解決張貼的問題題。

這裏if (..., boolean).1 {表達式計算第二個元組的元素,一個布爾值,並且第一個元組元素僅被評估爲其副作用。

所以,你可以不喜歡的東西內嵌的指數遞減while循環條件,而不是一條線之前或之後:

var index = 5 
while (index -= 1, index >= 0).1 { 
    print(index) 
} 

// 4 
// 3 
// 2 
// 1 
// 0 

儘管while case let結構不允許以前的任務到index在循環的下一次迭代堅持:

var index = 0 
while case let index = index + 1 { 
    print(index) 
} 

// 1 
// 1 
// 1 
// 1 
// infinite loop