画像付きの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 '!'?
_
エラーが言うように、あなたは「!」を使わなければなりません、
以下のコードを試してください、
let img = UIImage(named: "turn_left") as UIImage! // implicitly unwrapped
OR
let img : UIImage? = UIImage(named: "turn_left") //optional
編集
img
を作成したら、使用する前にnilをチェックする必要があります。
あなたはいつでも 'if let'でそれを行うことができますが、Swiftのバージョンによる構文の違いに注意してください。
Swift <2.:
if let img = img as? UIImage {
Swift 2.:
if let img = img as UIImage! {
感嘆符の位置に注意してください
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を使用すると、ランタイムで自動的にアンラップされ、安全に使用できます。
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
}
UIImage
をUIImage
にキャストする必要はありません。それは無駄です。
編集:完全なコード
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」が存在しない場合に機能する可能性が高い形状またはその他の何かに設定することができます。