2017-01-07 42 views
0

我在更新我的iOS應用程序的代碼到最新版本的Swift時遇到問題。明確指定的類型'NSURL?'問題,同時更新到Swift 3

我有一個函數:

public class func gifWithURL(gifUrl:String) -> UIImage? { 
    // Validate URL 
    guard let bundleURL:NSURL? = NSURL(string: gifUrl) 
     else { 
      print("SwiftGif: This image named \"\(gifUrl)\" does not exist") 
      return nil 
    } 

    // Validate data 
    guard let imageData = NSData(contentsOf: bundleURL! as URL) else { 
     print("SwiftGif: Cannot turn image named \"\(gifUrl)\" into NSData") 
     return nil 
    } 

    return gifWithData(data: imageData) 
} 

而且我得到以下行警告:

guard let bundleURL:NSURL? = NSURL(string: gifUrl) 

和我得到的警告:

明確指定類型「NSURL ?爲初始化程序增加了一個額外的可選級別,使可選檢查始終成功

Xcode允許我自動修復此問題。當我執行此自動修復時,我的代碼更改爲:

guard let bundleURL:NSURL NSURL(string: gifUrl) 

這顯然不是正確的語法。

我不確定我需要添加/刪除以使我的代碼完全符合Swift 3標準的最新進展和工作。

回答

2

NSURL(string:)將返回可選NSURL?實例,並且您已經任選guard包裹它,以便去除: NSURL?因爲你再設置optional代替non-optional此外,斯威夫特3使用本地URLData代替NSURLNSData。整個代碼會是這樣的。

guard let bundleURL = URL(string: gifUrl), let imageData = try? Data(contentsOf: bundleURL) else { 
    print("SwiftGif: This image named \"\(gifUrl)\" does not exist") 
    return nil 
} 
//Access the imageData here 

注:Data(contentsOf:)throws例外,所以你要抓住它使用do try catch塊。

1

你這樣做太複雜了。在Swift 3中,我們不使用NSURL。這只是URL

guard let bundleURL = URL(string: gifUrl) else { 
    print("SwiftGif: This image named \"\(gifUrl)\" does not exist") 
    return nil 
} 

然後你也可以擺脫危險的力量鑄造的:

guard let imageData = NSData(contentsOf: bundleURL) else { 
    print("SwiftGif: Cannot turn image named \"\(gifUrl)\" into NSData") 
    return nil 
}