將此Objective-C代碼轉換爲Swift的正確方法是什麼?雖然在swift中賦值
while ((size = [inputdata readWithByteArray:buf]) != -1) {
//...
}
我需要與此類似(from here):
while let super = view?.superview {
count++
view = super
}
但對我來說,我必須值與-1
而不是nil
比較。
將此Objective-C代碼轉換爲Swift的正確方法是什麼?雖然在swift中賦值
while ((size = [inputdata readWithByteArray:buf]) != -1) {
//...
}
我需要與此類似(from here):
while let super = view?.superview {
count++
view = super
}
但對我來說,我必須值與-1
而不是nil
比較。
可以使用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由克里斯·拉特納 說明。)
,我發現,接受的答案了基於元組的代碼很有趣的解決張貼的問題題。
這裏
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
'.1'是什麼意思? – Vyacheslav
@Vyacheslav:我想我已經找到了一個更好的解決方案,請參閱更新。 –
10x。但用'.1'值保存答案。這是相當有趣的實現,imo。 – Vyacheslav