2017-01-07 8 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の標準と作業でコードを完全に最新にするために、私が追加/削除する必要があることがわかりません。あなたはスウィフト3使用ネイティブURL、代わりにNSURLNSDataDataに、また再びoptional代わりのnon-optionalを、それを設定しているので、そう: NSURL?を削除

答えて

2

NSURL(string:)はオプションNSURL?インスタンスを返します、あなたはすでに、必要に応じてguardでそれをラップしています。コード全体が同じようになります。

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:)はあなたがdo try catchブロックを使用してそれをキャッチする必要がありますのでthrows例外。

1

あなたはあまりにも複雑です。スイフト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 
} 
関連する問題