2017-01-07 10 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 также в Swift 3 использовании нативного URL и Data вместо NSURL и NSData. Весь код будет похож.

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 
}