Swift:检查有一个协议并使用 getter 就像在 Java 中一样

Swift: Check has a protocol and use getter Like you would in Java

我想知道是否可以检查 class 是否符合 swift 中的协议。

我有一个 EntityObject class,它包含 Java 中的一些基本功能,我将其抽象化,但由于 swift 不进行抽象,所以我 运行 像这样。

我还有一个实体协议,它需要一个 getter 作为路径 属性(实际上并不存在,但总是 returns 我们 API 中的路径) .

现在在始终扩展的 EntityObject class 中(否则你会遇到致命错误)。我想获得此路径,但 EntityObject 不符合实体协议,但在大多数情况下它的子项符合。

示例路径 getter:

class var path:String {get { return "blog/{blogId}/comments" } }

使用 reflect() 的 getters 没有出现在镜像中,可能是因为它是一个 class(static) 变量,我尝试了类似的方法:

if let entity = self as? Entity {
    return entity.path
}

但这 returns 实体的一个实例(我猜),因为不允许我使用此处的路径或查看任何选项。

有谁知道我是否可以通用地执行此操作?

您可以检查 class 是否符合 swift 中的协议:

 if myClass.conformsToProtocol(ProtocolName) {
    //class conforms to protocol
 }

因为我想调用的 属性 不是一个实例,而是一个类型 属性 我无法从实例中获取它,动态类型 属性 确实让我.所以在我的情况下是这样。

    if let path = self.dynamicType.valueForKey("path") as? String {
        return path
    }

这将获取路径变量作为字符串(如果存在)。使我的整个功能:

func getPath() -> String? {
    if let path = self.dynamicType.valueForKey("path") as? String {
        return path
    }

    ErrorClass.log("Path not implemented on \(self), does not inherit from entity?")
    return nil
}