在 for 循环中将 let 变量作为标记传递时出现错误,但当我用数字替换变量时却没有出现错误。我可以 println(i) 并返回一个数字。 为什么不接受它作为 key ?
我也试过将 var 设置为计数器,结果相同
我得到一个错误: swift_dynamicCastObjCClassUnconditional
完整错误: 线程 1:EXC_BREAKPOINT(code=1, subcode=0x1001ee4b0)
func updateThing() {
for (i, img) in enumerate(thingState) {
switch img {
case 0:
image = UIImage(named: "0.png");
break
case 1:
image = UIImage(named: "1.png");
break
case 2:
image = UIImage(named: "2.png");
break
default:
image = UIImage(named: "x.png");
}
thing = self.view.viewWithTag(i) as UIButton;
thing.setImage(image, forState: .Normal);
}
但是如果我用一个数字替换 i 则没有错误并且带有指定标签的图像发生变化,如果我 println(i) 我每次通过都会得到一个数字
thing = self.view.viewWithTag(2) as UIButton;
请您参考如下方法:
你要确保你的 View 是按钮,否则它将无法转换你的 View 。
func updateThing() {
for (i, img) in enumerate(thingState) {
switch img {
case 0:
image = UIImage(named: "0.png");
break
case 1:
image = UIImage(named: "1.png");
break
case 2:
image = UIImage(named: "2.png");
break
default:
image = UIImage(named: "x.png");
}
if let thing = self.view.viewWithTag(i) as? UIButton {
thing.setImage(image, forState: .Normal)
}
}
}
可选的转换运算符 (as?) 优于转换运算符 (as),因为它不会在转换失败时使您的应用程序崩溃。
哦,分号在 Swift 中毫无用处:)
编辑:
在最新的Swift版本中,as已经被替换为as!,但是as仍然存在。
as!用于在没有检查的情况下强制转换,并且容易出现崩溃。您主要使用它进行向下转换,并且您绝对确定对象的类型。as可以用作向上转换,例如CAShapeLayer到CALayer或其他特殊情况,例如[NSObject:AnyObject]到NSDictionary。使沮丧将无法编译。
