2017-04-15 16 views
1

真實警告。它可以工作,但編譯器會給出警告',因爲'測試總是爲真。這當然是一個謊言因爲如果該值不是nilas才能成功。「作爲」測試總是在我使用<code>as Int</code>在<code>switch</code>情況下解開一個可選的斯威夫特switch語句

考慮這個最小的,可驗證的例子:

var age: Int? 

switch age { 
case let y as Int: // warning: 'as' test is always true 
    print(y) 
case nil: 
    print("it is nil") 
} 

輸出:

是零

問題:什麼是斯威夫特想着這裏的警告,是有一個更好的方式來打開價值而不必使用武力解開?

試試吧here

+0

看起來像一個錯誤 - 和[這裏已經提交] (https://bugs.swift.org/browse/SR-1703)。 – Hamish

+0

請注意,指出'print(「\(y)」)是不必要的字符串插值。 – matt

+0

@matt,是的。從一個更復雜的例子中解脫出來就是剩下的。我想我現在可以改正它,因爲沒有答案直接提到它。 – vacawama

回答

5

這是一個錯誤,由as Int帶來的 - 因爲如果ynil,它是肯定的詮釋。

在這種情況下(「有沒有更好的方式來解開的價值,而不必使用武力展開」)正確的語法是:

switch age { 
    case let y?: 
     print(y) 
    case nil: 
     print("it is nil") 
    } 
0

您正在使用switch語句。開關語句不同於「如果讓」。 Switch假設你會嘗試區分不同的類型,而不是在某種類型和零之間。只寫

if let y = age { 
    // Not nil 
} else { 
    // nil 
} 
+0

這只是一個玩具(最小)示例來演示問題。 – vacawama

1

正如@Hamish在評論中指出的,這是一個bug

在bug報告的意見建議使用.some(let y)解開可選的解決方法。

例如:

var age: Int? = 6 

switch age { 
case .some(let y) where y % 2 == 0: 
    print("\(y) is even") 
case .some(let y) where y % 2 == 1: 
    print("\(y) is odd") 
default: 
    print("not odd or even, must be nil") 
} 

@Hamish再來通過與建議,使用語法糖case let y?

var age: Int? = 7 

switch age { 
case let y? where y % 2 == 0: 
    print("\(y) is even") 
case let y? where y % 2 == 1: 
    print("\(y) is odd") 
default: 
    print("not odd or even, must be nil") 
} 
+0

你也可以使用可選模式'case let y?的語法糖版本?其中y%2 == 0' :) – Hamish

+0

@Hamish,優秀!我們有一個贏家! – vacawama