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! {