2014-07-06 35 views
108

我打開字典中的兩個值,在使用它們之前,我必須對它們進行投射並測試正確的類型。這是我想出了:在Swift中使用多個let-if

var latitude : AnyObject! = imageDictionary["latitude"] 
var longitude : AnyObject! = imageDictionary["longitude"] 

if let latitudeDouble = latitude as? Double { 
    if let longitudeDouble = longitude as? Double { 
     // do stuff here 
    } 
} 

但我想打包兩個,如果讓查詢到一個。所以它會這樣的:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double { 
    // do stuff here 
} 

該語法不工作,所以我想知道是否有一個美麗的方式來做到這一點。

+1

[展開在if語句多個自選]的可能重複( http://stackoverflow.com/questions/24548999/unwrapping-multiple-optionals-in-if-statement) – Jack

+0

可能有一種方法可以使用switch語句來模式化類型。查看[文檔](https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_448 ): – lomokat

+1

[使用「如果讓...」與許多表達式)可能的重複(http://stackoverflow.com/questions/24118900/using-if-let-with-many-expressions) – rickster

回答

215

更新斯威夫特3:

以下將斯威夫特3工作:

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double { 
    // latitudeDouble and longitudeDouble are non-optional in here 
} 

只是一定要記住的是,如果試圖可選綁定的一個出現故障,裏面的代碼if-let塊將不會被執行。

注意:子句並不一定都是'let'子句,你可以有任何一系列用逗號分隔的布爾檢查。

例如:

if let latitudeDouble = latitude as? Double, importantThing == true { 
    // latitudeDouble is non-optional in here and importantThing is true 
} 

雨燕1.2:

蘋果可能已經讀過你的問題,因爲你希望的代碼(目前處於測試階段)正確編譯在雨燕1.2:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double { 
    // do stuff here 
} 

雨燕1.1及更早版本:

這裏是個好消息 - 你完全可以做到這一點。你的兩個值的元組switch語句可以使用模式匹配在同一時間他們都投給Double

var latitude: Any! = imageDictionary["latitude"] 
var longitude: Any! = imageDictionary["longitude"] 

switch (latitude, longitude) { 
case let (lat as Double, long as Double): 
    println("lat: \(lat), long: \(long)") 
default: 
    println("Couldn't understand latitude or longitude as Double") 
} 

更新:這個代碼的版本目前工作正常。

+0

它不起作用在Xcode 6.1.1中:( –

+0

它適用於6.1.1,@AaronBratcher爲什麼不對你? – Caipivara

+0

檢查http://swiftstub.com/569478972/ – Caipivara

4

雨燕3.0

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double { 
    // do stuff here 
} 
+3

你應該建議編輯接受的答案,不要添加其他質量較低的答案。 – jervine10

2

與SWIFT 3,你可以使用可選的鏈接,switch語句或可選的模式,以解決您的問題。


1.使用if let(可選的結合/任選的鏈)

有關可選鏈接的Swift Programming Language狀態:

多個查詢可被鏈接在一起,並且整個鏈擺好如果任何失敗鏈中的鏈接是零。

因此,在簡單的情況下,可以使用以下方式在您的可選鏈接操作使用多個查詢:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

if let latitude = latitude as? Double, let longitude = longitude as? Double { 
    print(latitude, longitude) 
} 

// prints: 2.0 10.0 

2.使用元組和值在switch語句結合

作爲一個簡單的可選鏈接的替代,switch statement與元組和值結合使用時,可以提供一個細粒度溶液:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

switch (latitude, longitude) { 
case let (Optional.some(latitude as Double), Optional.some(longitude as Double)): 
    print(latitude, longitude) 
default: 
    break 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

switch (latitude, longitude) { 
case let (latitude as Double, longitude as Double): 
    print(latitude, longitude) 
default: 
    break 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

switch (latitude as? Double, longitude as? Double) { 
case let (.some(latitude), .some(longitude)): 
    print(latitude, longitude) 
default: 
    break 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

switch (latitude as? Double, longitude as? Double) { 
case let (latitude?, longitude?): 
    print(latitude, longitude) 
default: 
    break 
} 

// prints: 2.0 10.0 

3. if case(可選圖案)

if caseoptional pattern)提供了一種使用conveni元組ent方式來解開可選枚舉的值。您可以使用元組使用它,以便與多個查詢執行一些可選的鏈接:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) { 
    print(latitude, longitude) 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

if case let (latitude as Double, longitude as Double) = (latitude, longitude) { 
    print(latitude, longitude) 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) { 
    print(latitude, longitude) 
} 

// prints: 2.0 10.0 
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?] 
let latitude = dict["latitude"] 
let longitude = dict["longitude"] 

if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) { 
    print(latitude, longitude) 
} 

// prints: 2.0 10.0 
相關問題