具有协议扩展的Swift Generic Unknown Member

时间:2015-11-21 21:38:54

标签: ios swift generics protocols

如果我有以下代码:

protocol ObjectType {
    var title: String { get set }
}

extension ObjectType {
    var objectTypeString: String {
        let mirror = Mirror(reflecting: self)
        return "\(mirror.subjectType)"
    }
}

class Object: ObjectType {
    var title = ""
}

class SomeOtherClass {
    private func someFunc<T: Object>(object: T) {
        print(object.objectTypeString)
    }
}

Object符合ObjectType,您可以在任何objectTypeString上访问ObjectInstance。但是编译器在Type T has no member objectTypeString访问该成员时,会在Object继承某些泛型类型时表示Object,如上面的代码所示。当函数是非泛型函数并且只传入<T: ObjectType>参数时,没有问题。那么为什么参数是通用的,所以我无法访问符合类应该有权访问的协议成员?

我遇到了这个问题here,但我对解决方法不感兴趣,我只想了解通用系统的含义,这使我的示例无效。 (简单的解决方法是执行def

1 个答案:

答案 0 :(得分:0)

也许我错了,或者我完全不理解你的问题,但我认为你可能会错过发起&#34;反对&#34;。

您愿意的代码可能是以下代码:

    protocol ObjectType {
    var title: String { get set }
}

extension ObjectType {
    var objectTypeString: String {
        let mirror = Mirror(reflecting: self)
        return "\(mirror.subjectType)"
    }
}

class Object: ObjectType {
    var title = ""
}

class SomeOtherClass {
    private func someFunc<T: Object>(object: T) {
        let object = Object()
        print(object.objectTypeString)
    }
}

但问题是,即使我们不启动对象,自动完成也会使objectTypeString上升!这是我不理解的,正如你所说的那样,也许是错误发生的地方!

希望它有所帮助&lt; 3