1

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

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

每个“棘手”都是一个Optional<Binding>

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

可变打印:字符串=“

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(或者是一个字符串);我想人们可能不得不用默认情况来覆盖那里的任何其他可能性。

有没有更快捷的方法?

有没有办法得到一个类型Optional<Binding>

(顺便说一句,特别是关于 SQLite.swift;我可能从 doco 中不知道有一种方法可以“获取 n 列的类型”。这很酷,但是,一般来说,上一段中的问题仍然存在。 )

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
  }
}

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