Swift3,解包可选<binding>(在SQLite.swift中)

时间:2016-12-19 21:10:06

标签: ios swift3 optional optional-binding

在最优秀的SQLite.swift中,我有

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

每个&#34;棘手&#34;是Optional<Binding>

我知道打开每个棘手问题的唯一方法就是这样

var printable:String =&#34;

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>的类型

(特别是BTW关于SQLite.swift;我可能有一种方式从doco中没有意识到&#34;得到列n&#34;的类型。那会很酷,但是,问题在于一般而言,前一段仍然存在。)

1 个答案:

答案 0 :(得分: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
  }
}

如果需要,您还可以在一个或多个案例中添加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
  }
}