如何通过其实例调用类的静态函数

时间:2015-05-31 16:54:23

标签: ios swift cocoa-touch

我有一个简单的课程:

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可以是TableItemEditableItem

2 个答案:

答案 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
}