具有协议扩展的Swift Generic Unknown Member

bar*_*dog 6 generics protocols ios swift

如果我有以下代码:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Object符合的地方ObjectType,你会期望你可以访问objectTypeString任何ObjectInstance.但编译器说Type T has no member objectTypeString当在某个继承的泛型类型上访问该成员时Object,如上面的代码所示.当函数是非泛型函数并且仅传入Object参数时,没有问题.那么为什么参数是通用的,所以我无法访问符合类应该访问的协议成员?

我在这里遇到了这个问题,但我对解决方法不感兴趣,我只想了解通用系统是什么让我的例子不起作用.(简单的解决方法是做<T: ObjectType>)

sci*_*15t 0

也许我错了,或者我没有完全理解你的问题,但我认为你可能错过了启动“对象”。

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

    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)
    }
}
Run Code Online (Sandbox Code Playgroud)

但问题是,即使我们不启动对象,自动完成也会带来 objectTypeString!这就是我不明白的地方,正如你所说,也许这就是错误发生的地方!

希望有帮助 <3