如何在Xcode 8.3中的'if let'语句中修复类型转换的警告?

Vit*_*wer 10 swift swift3

请考虑以下代码:

let nsdate: NSDate? = NSDate()
if let date = nsdate as? Date { // a warning occurs here
    print(date)
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨如下: Conditional downcast from 'NSDate?' to 'Date' is a bridging conversion; did you mean to use 'as'?

从铸造NSDataData有同样的问题.怎么解决呢?

Jur*_*sic 31

尝试强制转换为可选日期:

if let date = nsdate as Date?
Run Code Online (Sandbox Code Playgroud)

您正在尝试将可选 NSDate 的可选强制转换为NON可选日期.只要NSDate从obj-c桥接到Date,所以这个演员总是成功,所以这里不需要任选的演员阵容,只需基本演员as就足够了.然后你需要转换可选值,因此结果值也必须是可选的,因此Date?这里是合适的.


vad*_*ian 5

Swift 3.1区分

  • 一个可选的as? Foo

    例如,它向更具体的类型转换更具特异性

    let dict : [String:Any] = ["Foo" : 12]
    let number = dict["Foo"] as? Int
    
    Run Code Online (Sandbox Code Playgroud)
  • 可选类型的投as Foo?

    它将(核心)基础类型接到免费的 Swift类型,反之亦然.

    它是通常的非可选语法的可选等效项

    let string : NSString = "Foo"
    let swiftString = string as String
    
    Run Code Online (Sandbox Code Playgroud)

对于开发人员而言,这种差异是微妙的,但对编译器非常有用.

NS...如果有一个原生的Swift对应物,基本上不要在Swift 3中使用Foundation类.