ios - 具有协议(protocol)扩展的 Swift 通用未知成员

标签 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 时参数,没有问题。那么,为什么要让参数成为通用参数,这样我就无法访问符合类应该有权访问的协议(protocol)成员?

我遇到了这个问题 here但我对变通方法不感兴趣,我只想了解是什么让我的示例无法正常工作的通用系统。 (简单的解决方法是执行 <T: ObjectType> )

最佳答案

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

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

    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 !这就是我不明白的地方,正如你所说,这可能是错误发生的地方!

希望对你有帮助<3

关于ios - 具有协议(protocol)扩展的 Swift 通用未知成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848879/

相关文章:

swift - 从呈现的 View Controller 访问呈现的 View Controller ?

ios - 在捕获列表中使用 unowned 导致崩溃,即使 block 本身没有执行

c# - .Equals 上的 C# 泛型方法中的意外行为

ios - 应用程序组中的 NSUserDefaults 不起作用

ios - Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

ios - Swift:如何安排以编程方式添加的复选框?

java - 递归方法中的泛型

java - 自动生成非泛型接口(interface)实现

iOS Facebook 访问 token 获取用户墙订阅源(状态)

iOS 应用程序崩溃并出现符号未找到错误