2016-12-19 5 views
1

をアンラップ、私はSwift3、最も優れたSQLite.swiftで(SQLite.swift中)<Binding>オプション

let stmt = try local.db!.prepare(..) 
for row in stmt { 
    for tricky in row { 

を持っている各 "トリッキー" は、それぞれのラップを解除するには、私が知っている唯一の方法Optional<Binding>

ですトリッキーなこの

のvar印刷可能なようなものです:文字列= "

if let trickyNotNil = tricky { 
    if let anInt:Int64 = trickyNotNil as? Int64 { 
     print("it's an Int") 
     .. use anInt 
     } 
    if let aString:String = trickyNotNil as? String { 
     print("it's a String") 
     .. use aString} 
} 
else { 
    tricky is nil, do something else 
} 

この例では、Int64またはString(またはStringに行くもの)のいずれかにしかなり得ないと確信しています。おそらくデフォルトのケースでは、そこに他の可能性をカバーしなければならないだろうと思います。

すてきな方法がありますか?

のタイプはOptional<Binding>ですか?

(具体的には、SQLite.swiftに関して、私はドコモから「nの型を取得する」ことを知らない方法があるかもしれませんが、それはクールですが、前項の質問は残っています

+2

あなたはを参照、switchステートメントを使用することができ、switchステートメントのこの種は、次のようになりますのためのサンプルコード例[パターンマッチし、1つのSwitch文で条件付きでバインド](http://stackoverflow.com/q/38980403/2976878) – Hamish

+0

http://stackoverflow.com/a/33975661/2303865 –

+0

右: nil case "DuncanCの説明は可能です – Fattie

答えて

1

クラスに基づいてswitch文を使用できます。

let array: [Any?] = ["One", 1, nil, "Two", 2] 

for item in array { 
    switch item { 
    case let anInt as Int: 
    print("Element is int \(anInt)") 
    case let aString as String: 
    print("Element is String \"\(aString)\"") 
    case nil: 
    print("Element is nil") 
    default: 
    break 
    } 
} 

必要な場合にも、あなたの例一つ以上のwhere句を追加することができます:

let array: [Any?] = ["One", 1, nil, "Two", 2, "One Hundred", 100] 

for item in array { 
    switch item { 
    case let anInt as Int 
     where anInt < 100: 
    print("Element is int < 100 == \(anInt)") 
    case let anInt as Int where anInt >= 100: 
    print("Element is int >= 100 == \(anInt)") 
    case let aString as String: 
    print("Element is String \"\(aString)\"") 
    case nil: 
    print("Element is nil") 
    default: 
    break 
    } 
} 
関連する問題