采用Metatype的Swift函数?

时间:2014-07-08 23:57:07

标签: ios swift

正如Apple在Swift的文档Metatype Type部分所说:

  

元类型类型是指任何类型的类型,包括类类型,结构类型,枚举类型和协议类型。

是否有基类来引用任何类,结构,枚举或协议(例如 MetaType )?

我的理解是协议类型仅限于用作通用约束,因为Self或相关类型要求(嗯,这是Xcode错误告诉我的)。

那么,考虑到这一点,也许有一个 Class 基类来识别类引用?或者所有可构造类型(class,struct,enum)的 Type 基类?其他可能性可能是协议结构枚举关闭

如果你不理解我的意思,请参阅此示例。

func funcWithType (type: Type) {
  // I could store this Type reference in an ivar,
  // as an associated type on a per-instance level.
  // (if this func was in a class, of course)
  self.instanceType = type
}

funcWithType(String.self)
funcWithType(CGRect.self)

虽然泛型在1-2个常量关联类型中运行良好,但我不介意能够将关联类型视为实例变量。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:11)

这有效:

func funcWithType (type: Any.Type) {
}

funcWithType(String.self)
funcWithType(CGRect.self)

答案 1 :(得分:3)

鉴于您的示例,实现将是:

// protocol that requires an initializer so you can later call init from the type
protocol Initializeable {
    init()
}

func funcWithType (type: Initializeable.Type) {
    // make a new instance of the type
    let instanceType = type()
    // in Swift 2 you have to explicitly call the initializer:
    let instanceType = type.init()

    // in addition you can call any static method or variable of the type (in this case nothing because Initializeable doesn't declare any)
}

// make String and CGRect conform to the protocol
extension String: Initializeable {}
extension CGRect: Initializeable {}

funcWithType(String.self)
funcWithType(CGRect.self)