Ios 如何通过实例调用类的静态函数
我有一个简单的课程:Ios 如何通过实例调用类的静态函数,ios,swift,cocoa-touch,Ios,Swift,Cocoa Touch,我有一个简单的课程: class TableItem { class func cellIden() -> String { return "TableItem" } } 以及TableItem class EditableItem { override class func cellIden() -> String { return "EditableItem" } } 然后,在我的代码的某个地方,我有: var items: [TableIte
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没有名为“cellIden”的成员。
如何从类的实例调用其静态方法
注意:我无法调用
TableItem.cellIden()
,因为I
可以是TableItem
或EditableItem
您需要获取I
的运行时类型。每个实例都有一个返回其运行时(动态)类型的dynamicType
属性:
class EditableItem {
override class func cellIden() -> String {
return "EditableItem"
}
}
它记录在。中,因为您希望查询实例而不是类,所以可以提供实例方法(该方法将返回类的方法)。您只需要在基类中执行,这会对用户隐藏实现
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
}
几乎是重复的(关于类型属性而不是类型方法)。但这不是我想要做的。我想要一个静态函数,因为cellIden独立于任何实例,需要在单元格实例化之前调用它。它调用class函数,该函数将返回类/子类的正确字符串。它只是对调用者隐藏了实现。也许,但不是正确的方法。谢谢你。