Ios 从'向下投射;UIImage?&x27;至';UIImage';仅打开选项

Ios 从'向下投射;UIImage?&x27;至';UIImage';仅打开选项,ios,xcode,swift,uiimage,Ios,Xcode,Swift,Uiimage,我正在创建一个带有图像的ui按钮 我已经为此编写了以下代码: 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, fo

我正在创建一个带有图像的
ui按钮

我已经为此编写了以下代码:

    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)
但是我在下面的
中得到了错误,让img=UIImage(名为:“左转”)作为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

编辑


创建
img
后,您需要在使用它之前检查它是否为nil。

如果
UIImage
初始化器找不到指定的文件(或发生其他错误),它将根据苹果的文档返回
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
,将按钮设置为一个形状或其他更可能在“左转”不存在的情况下工作的形状。

因为
UIImage(名为:“某物”)
返回一个可选的(因为如果这些方法没有找到合适的图像,它可能是零。最好不要显式地打开结果(否则你的应用程序会崩溃),而是立即用类似的方法检查结果:

        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(名称:)
可以返回nil,您必须处理该问题。如果显式地将其展开,则以后可能会出现问题


使用
if-let-something=…
在运行时自动展开某些内容,您可以安全地使用它。

您始终可以使用“if-let”来完成此操作,但请注意语法上的差异取决于swift的版本

Swift<2.0

if let img = img as? UIImage {
Swift 2.0

if let img = img as UIImage! {

请注意感叹号的位置

请注意此解决方案。虽然它可以工作,但您仍然将UIImage显式转换为UIImage(多余代码),并且不利用快速的隐式键入。在对其进行任何操作之前,您还需要检查
img
是否为零。第一个版本现在发出警告,该位置的!很快将被弃用。Wift不会在
if
语句中使用括号。是否有人可以将此更改的基本原理发布为好?
if let img = img as UIImage! {