1

最も優れた SQLite.swift では、

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

それぞれの「トリッキー」はOptional<Binding>

各トリッキーをアンラップするために私が知っている唯一の方法は、このようなものです

var printable:String = "

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 の型を取得する」ために doco から私が知らない方法があるかもしれません。それはクールですが、前の段落の質問は一般的に残っています。 )

4

1 に答える 1

1

クラスに基づいて switch ステートメントを使用できます。この種類の 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
  }
}

必要に応じて、1 つ以上のケースに 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
  }
}
于 2016-12-19T21:25:20.320 に答える