2017-04-13 20 views
5

考慮下面的代碼:如何在Xcode 8.3的'if let'語句中修復類型轉換的警告?

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

編譯器會抱怨這樣的:Conditional downcast from 'NSDate?' to 'Date' is a bridging conversion; did you mean to use 'as'?

NSData強制轉換爲Data有同樣的問題。如何解決它?

+0

FYI:斯威夫特3編譯器不抱怨關於你的代碼;-)應該是Swift 3.1的東西... –

+0

更新到Xcode 8.3.1後會發生警告。我曾在操場上試過它。 –

+2

爲什麼要聲明一個**可選的**常量,而是指定**非可選的**值。這太瘋狂了。 **不要註釋編譯器可以推斷的類型**。你做得更糟。 – vadian

回答

17

嘗試轉換爲可選數據:

if let date = nsdate as Date? 

你試圖可選可選的NSDate來非可選日期。只要NSDate是從obj-c橋接到Date,所以這個施放總是成功的,所以這裏沒有可選施放需求,只需要基礎施放as就夠了。然後您需要投射可選值,因此結果值也必須是可選的,因此Date?在此適用。

5

夫特3.1區分

  • 可選向下鑄造as? Foo

    投下更非特異性到一個更具體的類型例如

    let dict : [String:Any] = ["Foo" : 12] 
    let number = dict["Foo"] as? Int 
    
  • 一個投可選類型as Foo?

    橋樑一(核心)基金類型爲免費電話雨燕,反之亦然。

    這是通常的非可選語法

    let string : NSString = "Foo" 
    let swiftString = string as String 
    

的差別是細微的開發者,但編譯器非常有用的可選當量。

如果存在Swift原生對象,基本上不要在Swift 3中使用NS...基礎類。

0

試試這個:

let nsdate: NSDate? = NSDate() 

if let date = nsdate { 
    print(date) 
} 

編譯器知道it's一個NSDate,如果解開,所以你在做什麼其實是鑄造一個NSDate的日期