更新到 Swift 时出现明确指定的类型 'NSURL?' 问题 3

Explicitly specified type 'NSURL?' issue while updating to Swift 3

我在将我的 iOS 应用代码更新到最新版本的 Swift 时遇到问题。

我有一个功能:

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)

我收到警告:

Explicitly specified type 'NSURL?' adds an additional level of optional to the initializer, making the optional check always succeed

Xcode 允许我自动修复问题。当我执行此自动修复时,我的代码更改为:

guard let bundleURL:NSURL NSURL(string: gifUrl)

这显然不是正确的语法。

我不确定我需要 add/remove 什么才能使我的代码完全符合 Swift 3 标准并正常工作。

NSURL(string:) 将 return 可选 NSURL? 实例并且您已经选择用 guard 包装它所以删除 : NSURL? 因为您正在再次设置它optional 而不是 non-optional 同样,在 Swift 3 中使用原生 URL and Data 而不是 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 块捕获它。

你做的太复杂了。在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
}