web-dev-qa-db-ja.com

迅速。 nilを返すURL

アプリでウェブサイトを開こうとしていますが、何らかの理由で1行がnilを返し続けるので、私のコードは次のとおりです。

let url = URL(string: "http://en.wikipedia.org/wiki/\(element.Name)")!
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(url)
    }
}

最初の行です(let url = URL...)このエラーを返し続けます:

致命的なエラー:オプション値のアンラップ中に予期せずnilが見つかりました。

これを修正するにはどうすればよいですか?

11
Benja0906

(!)で強制的にアンラップしないでください。 (!)を使用し、変数の値がnilの場合、プログラムがクラッシュし、そのエラーが発生します。代わりに、「guard let」または「if let」ステートメントを使用してオプションを安全にアンラップする必要があります。

guard let name = element.Name as? String else {
    print("something went wrong, element.Name can not be cast to String")
    return
}

if let url = URL(string: "http://en.wikipedia.org/wiki/\(name)") {
    UIApplication.shared.openURL(url)
} else {
    print("could not open url, it was nil")
}

それでもうまくいかない場合は、element.Nameに問題がある可能性があります。それでも問題が解決しない場合は、次がオプションかどうかを確認します。

更新

Element.NameプロパティをチェックしてStringとしてキャストし、作成する必要のある目的のURLを作成できるかどうかを確認する方法を追加しました。以前に投稿したコードの上にあるコードを見ることができます。

4
user3353890

これは役立つと思います。 element.nameには単語間にスペースが含まれる可能性があるため、addingPercentEncodingはPercentEncoding文字列になります。

let txtAppend = (element.Name).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = "http://en.wikipedia.org/wiki/\(txtAppend!)"
let openUrl = NSURL(string: url)
if #available(iOS 10.0, *) {
    UIApplication.shared.open(openUrl as! URL, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(openUrl as! URL)
}
16
Dipal Patel

この修正のSwift 4バージョン:

str.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
3
BlaShadow

エンコードの問題である可能性があります。やってみました

let str = "http://en.wikipedia.org/wiki/\(element.Name)"
let encodedStr = str.stringByAddingPercentEncodingWithAllowedCharacters(NSCha‌​racterSet.URLQueryAl‌​lowedCharacterSet()
0
GetSwifty