web-dev-qa-db-ja.com

「UIImage?」からのダウンキャスト'UIImage'はオプションのみをラップ解除します

画像付きのUIButtonを作成しています。

そのために以下のコードを書きました:

_    let btnImg=UIButton.buttonWithType(UIButtonType.Custom) as UIButton
    let img  = UIImage(named: "turn_left") as UIImage
    btnImg.setTitle("Turn left", forState: UIControlState.Normal)
    btnImg.setImage(img, forState: UIControlState.Normal)
    btnImg.frame = CGRectMake(10, 150, 200, 45)
    self.view.addSubview(btnImg)
_

しかし、私はlet img = UIImage(named: "turn_left") as UIImageで以下のエラーを受け取りました:

_Swift Compiler error:
 Downcast from 'UIImage?' to 'UIImage' only unwraps optionals; did you mean to use '!'?
_
18
NetDemo

エラーが言うように、あなたは「!」を使わなければなりません、

以下のコードを試してください、

   let img  = UIImage(named: "turn_left") as UIImage!  // implicitly unwrapped

OR

   let img : UIImage? = UIImage(named: "turn_left")  //optional

編集

imgを作成したら、使用する前にnilをチェックする必要があります。

35
Toseef Khilji

あなたはいつでも 'if let'でそれを行うことができますが、Swiftのバージョンによる構文の違いに注意してください。

Swift <2.

if let img = img as? UIImage {

Swift 2.

if let img = img as UIImage! {

感嘆符の位置に注意してください

15
Dustin Williams

UIImage(named:"something")はオプションを返します(メソッドが適切な画像を見つけられない場合はnilになる可能性があるため、結果を明示的にアンラップするのが最善の方法です(そうしないとアプリがクラッシュします)が、結果を確認します)そのようなものですぐに:

_        if let image = UIImage(named: "something"){
        // now you can use image without ? because you are sure to have an image here!
        image.description
        }

    // continue your code here using the optional power of Swift's vars! :)
_

アプローチは次のとおりです。画像がオプションの場合は、nullになる可能性があることを意味します。オプションで入力を受け取る関数は、それを処理できます。そうでない場合、通常、予期しない動作が発生します。 UIImage(named:)canはnilを返し、これを処理する必要があります。明示的に展開すると、後で問題が発生する可能性があります。

_if let something = ..._somethingを使用すると、ランタイムで自動的にアンラップされ、安全に使用できます。

2
GrizzlyBear

UIImageイニシャライザが指定されたファイルを見つけられない(または他のエラーが発生した)場合、Appleのドキュメントに従ってnilを返します

Return Value
The image object for the specified file, or nil if the method could not find the specified image.

したがって、チェックを入れる必要があります:

let img  = UIImage(named: "turn_left")
if(img != nil) {
    // Do some stuff with it
}

UIImageUIImageにキャストする必要はありません。それは無駄です。

編集:完全なコード

let img  = UIImage(named: "turn_left")
if(img != nil) {
    let btnImg = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
    btnImg.setTitle("Turn left", forState: UIControlState.Normal)
    btnImg.setImage(img, forState: UIControlState.Normal)
    btnImg.frame = CGRectMake(10, 150, 200, 45)
    self.view.addSubview(btnImg)
}

elseを挿入して、ボタンを「turn_left」が存在しない場合に機能する可能性が高い形状またはその他の何かに設定することができます。

2
jonogilmour