2017-07-26 107 views
1

我的理解是,'as?'並作爲!'運算符是向下轉換的,「as」用於上傳,消歧,橋接和模式匹配。但是在模式匹配過程中,'any'類型的'thing'被轉換並且dowoncasted爲 - 例如 - someInt作爲Int。爲什麼語法不是'as?'而不是'as'?在這種情況下,我很困惑爲什麼模式匹配與類型轉換有區別?模式匹配和類型鑄造之間的區別

var things = [Any]() 

things.append(0) 
things.append(0.0) 
things.append(42) 
things.append(3.14159) 
things.append("hello") 
things.append((3.0, 5.0)) 
things.append({ (name: String) -> String in "Hello, \(name)" }) 

for thing in things { 
switch thing { 
case 0 as Int: 
    print("zero as an Int") 
case 0 as Double: 
    print("zero as a Double") 
case let someInt as Int: 
    print("an integer value of \(someInt)") 
case let someDouble as Double where someDouble > 0: 
    print("a positive double value of \(someDouble)") 
case is Double: 
    print("some other double value that I don't want to print") 
case let someString as String: 
    print("a string value of \"\(someString)\"") 
case let (x, y) as (Double, Double): 
    print("an (x, y) point at \(x), \(y)") 
    case let stringConverter as (String) -> String: 
     print(stringConverter("Michael")) 
    default: 
     print("something else") 
} 
} 

回答

2

在模式匹配switch聲明,一個case如果在該指定casething的類型匹配的類型僅訪問。相應的陣容不會失敗(否則你不會在case),所以你不必擔心用as?as!解開演員陣容。