我四处搜寻,无法弄清楚我做错了什么。我正在尝试将UIButton
向下转换为以下代码行中的子类:
var currentButton: FileButton = UIButton(type: .System) as! FileButton
FileButton
是UIButton
的一个简单子类,它只使用按钮存储几个变量。代码如下:
import UIKit
class FileButton: UIButton {
var fileAddress: String = ""
var fileMsgId: String = ""
var fileAppId: String = ""
}
当我尝试执行此代码时,我在控制台中收到以下错误:
无法转换类型' UIButton' (0x19e9c9e40)来 ' CollectionFun.FileButton' (0x100127490)。
有什么想法?这似乎应该很简单,但我无法弄明白。感谢。
答案 0 :(得分:1)
只需致电:
var currentButton: FileButton = FileButton(type: .System)
答案 1 :(得分:0)
您不能在示例中向下转换对象。您创建UIButton
类型对象并尝试将其转换为其他对象,而不是它的parrent,或者在继承层次结构中更高,在这种情况下,新对象具有更多功能,例如需要分配更多内存。你可以编译你的代码而不会出现这样的错误:
var currentButton = UIButton(type: .System) as? FileButton
但它将是无用的代码,因为它将始终返回nil
更清楚地说明一个例子。你可以这样做:
var button1 = FileButton()
button1.fileAddress = "qwerty"
var button2 = button1 as UIButton
var button3 = button2 as? FileButton
print(button3.fileAddress)
print
将
可选(" QWERTY&#34)
并且它将起作用,因为第一个对象是FileButton
类型。
但是这段代码:
var button1 = UIButton()
var button2 = button1 as? FileButton
print(button2?.fileAddress)
将打印
零
你尝试做第二个例子
答案 2 :(得分:0)
与其他面向对象语言一样,如果将变量初始化为超类(在您的情况下为UIButton
),则无法将其向下转换为子类(在您的情况下为FileButton
)。这是因为您正在初始化UIButton
对象,而不是FileButton
。只需更改代码即可初始化FileButton
对象,它应该可以正常工作。
因此,您应该将UIButton(type: .System) as! FileButton
替换为FileButton(type: .System)
。请注意,现在不需要强制转换,因为我们正在直接初始化FileButton
对象。