1

私は load_image 関数を持っていて、動作します

load_image("http://blabla.com/bla.png")

しかし、このように変数を追加すると

 load_image(detailDesc2!)

このエラーを与える

fatal error: unexpectedly found nil while unwrapping an Optional value

私のコードはこちら

ViewController テーブルは、選択したコードを表示します。ここで、 detailDesc1 と detailDesc 2 を DetailView Controller に送信します

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let subcatVC = self.storyboard?.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        subcatVC.detailDesc1 = self.arrayCategory[indexPath.row][API_PARAM_CAT_ID] as! String
        subcatVC.detailDesc2 = self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE] as! String
        _ = UINavigationController(rootViewController: subcatVC)
        self.navigationController?.pushViewController(subcatVC, animated: false)
    }

詳細ViewController

   var detailDesc1:String?
    var detailDesc2:String?

    load_image(detailDesc2!)  // HERE GIVES ERROR

私の load_image 関数

func load_image(urlString:String)
{
    let imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            func display_image()
            {
                self.imagetbig.image = UIImage(data: data!)
            }

            dispatch_async(dispatch_get_main_queue(), display_image)
        }

    }

    task.resume()
}

また、このコードを追加すると、作業ラベルとテキストビューが表示されます。

textbig.text = detailDesc1
textim.text = detailDesc2
4

2 に答える 2

1

何らかの理由で変数detailDesc2があり、変数がオプションであると宣言されたときに変数が常に値を持つことをコンパイラーに伝えることnilを使用してアンラップを強制します(非値である可能性があります)。アップル!によると:

使ってみます!存在しないオプションの値にアクセスすると、ランタイム エラーが発生します。! を使用する前に、オプションに nil 以外の値が含まれていることを常に確認してください。その値を強制的にアンラップします。

オプションの bindingを使用して実行時エラーを回避できます。次のように、変数を使用する前に確認します。

if let url = detailDesc2 {
    load_image(url)
}

@LeoDabus が Swift 2 で推奨してguardいるように、次のように使用できるステートメントも使用できます。

guard if let url = detailDesc2 else {
   return 
}

load_image(url)

アップルによると:

ガード ステートメントは、if ステートメントと同様に、式のブール値に応じてステートメントを実行します。ガード ステートメントを使用して、ガード ステートメントの後のコードを実行するために、条件が真でなければならないことを要求します。if ステートメントとは異なり、guard ステートメントには常に else 句があります。条件が真でない場合、else 句内のコードが実行されます。

これがお役に立てば幸いです。

于 2015-10-02T13:02:53.153 に答える