【问题标题】:Swift: Check has a protocol and use getter Like you would in JavaSwift:Check 有一个协议并使用 getter 就像在 Java 中一样
【发布时间】:2015-04-29 09:43:35
【问题描述】:

我想知道是否可以在 swift 中检查一个类是否符合协议。

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

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

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

示例路径获取器:

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

使用 reflect() 的 getter 没有出现在 Mirror 中,可能是因为它是一个类(静态)变量,我尝试了类似的方法:

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

但这会返回一个实体实例(我猜),因为我不允许在这里使用路径或查看任何选项。

任何人都知道我是否可以通用地做到这一点?

【问题讨论】:

  • 您要求检查一个类是否符合协议,但您的问题是否则
  • 注意完全正确,它已经说明我只想访问一个变量,因此我认为我应该能够将它“转换”为协议。这似乎没有必要。感谢您的反对。我编辑了标题,因此它实际上更能反映问题的内容。

标签: ios swift generics reflection protocols


【解决方案1】:

由于我要调用的属性不是实例,而是 Type 属性,我无法从实例中获取它,但 dynamicType 属性确实让我可以。所以在我的情况下是这样的。

    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
}

【讨论】:

    【解决方案2】:

    你可以快速检查一个类是否符合协议:

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

    【讨论】:

    • 由于某种原因它不允许我,它一直要求我实例化协议或添加逗号我找到了一个适合我的确切情况的工作解决方案,尽管我会发布这个。
    • 这仅适用于 Objective-C 类,例如 NSObject 子类。 conformsToProtocol 不适用于纯 Swift 类。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2018-11-13
    • 2016-05-15
    • 1970-01-01
    • 2014-12-25
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多