swift类型(:):显示非可选类型的可选

时间:2018-01-24 15:43:10

标签: swift

例如,我们有var check: Int?,我们希望print(String(describing: type(of: check)))。我们进入控制台Optional<Int> 如何获得Int

2 个答案:

答案 0 :(得分:1)

您可以使用!运算符解包Optional:

 print(String(describing: type(of: check!)))

答案 1 :(得分:1)

我刚刚遇到了同样的问题。如果在运行时 check 不是 nil,您可以简单地解开它并执行 type(of:),例如:

if let unwrappedCheck = check {
    print(type(of: unwrappedCheck) // "Int"
}

但是,如果在运行时检查是 nil 并且您希望 type(of: check) 给您 Int 而不是 Optional<Int> 怎么办?经验证的答案不正确,因为它会在运行时抛出异常。我认为这是一个错误——如果你解包的东西 (type(of:)) 为零,你不能强制解包并执行 check

因为您静态地知道 checkInt? 类型,所以这很容易。您只需要一种方法来公开 Optional 的包装类型。请参阅 Optionalofficial declaration

@frozen enum Optional<Wrapped>
<块引用>

Optional 类型是一个枚举,有两种情况。 Optional.none 相当于 nil 文字。 Optional.some(Wrapped) 存储一个包装的值。

由于 Optional 在技术上是一个枚举,您可以使用一个简短的扩展名来转发 Wrapped 的类型。

extension Optional {
  typealias Wrapped = Wrapped
}

然后你可以这样使用它:

let check: Int? = nil
let wrappedType = type(of: check).Wrapped
print(wrappedType) // "Int"