我有一个简单的课程:
class TableItem {
class func cellIden() -> String {
return "TableItem"
}
}
和TableItem
class EditableItem {
override class func cellIden() -> String {
return "EditableItem"
}
}
然后,在我的代码中,我有这个:
var items: [TableItem] = [TableItem(), EditableItem()]
现在,我想要做的是,遍历项目并调用每个TableItem
的静态cellIden()
函数。
for i in items {
var iden = i.self.cellIden()
}
然而,它告诉我TableItem does not have a member called 'cellIden'
如何从其实例中调用类的静态方法?
注意:我无法致电TableItem.cellIden()
,因为i
可以是TableItem
或EditableItem
答案 0 :(得分:2)
您需要获取i
的运行时类型。每个实例都有一个dynamicType
属性,返回其运行时(动态)类型:
var iden = i.dynamicType.cellIden()
记录在The Swift Programming Language: “Dynamic Type Expression”。
答案 1 :(得分:0)
由于您希望查询实例而不是类,因此可以提供实例方法(将返回类的方法)。您只需要在基类中执行此操作,这会隐藏用户的实现...
class TableItem {
class func cellIden() -> String {
return "TableItem"
}
func iCellIden() -> String {
return self.dynamicType.cellIden()
}
}
class EditableItem: TableItem {
override class func cellIden() -> String {
return "EditableItem"
}
}
var items: [TableItem] = [TableItem(), EditableItem()]
for i in items {
println("\(i.dynamicType.cellIden())") // Works, fine
println("\(i.iCellIden())") // Equivalent, but removes responsibility from calle
}