【问题标题】:Access property on generic访问通用属性
【发布时间】:2019-08-07 12:53:47
【问题描述】:

在我的应用程序中,我使用了一个 CRUD 类,它使我能够使用泛型进行数据库操作。 create函数如下所示:

func create<T: Storable>(_ object: T.Type, completion: ((T) -> ())?)

这允许我执行以下操作:

database.create(Restaurant.self, completion: nil)

现在,Storable 协议有一个名为 primaryKey 的属性。但是,当我尝试在 create 函数中访问它时,它总是将默认值传递给我。

protocol Storable {

}
extension Storable {
    static var primaryKey: String {
        get {
            return "Storable"
        }
    }
}

class Restaurant: Storable {
    override public class var primaryKey: String {
        return "uuid"
    }
}

...

class Database {
    public func create<T: Storable>(_ object: T.Type, completion: ((T) -> ())?) {
        print("Primary key: ", object.primaryKey)
        print("T: ", type(of: T.init()))
    }
 }

上面将打印以下内容:

Primary key: Storable
T:  Storable

显然,主键应该是“uuid”。我做错了什么?

【问题讨论】:

标签: swift generics


【解决方案1】:

将您的属性添加为协议声明中的要求。

protocol Storable {
    static var primaryKey: String {get}
}
extension Storable {
    static var primaryKey: String {
        get {
            return "Storable"
        }
    }
}

否则你就没有多态性(正如你所观察到的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2023-03-13
    • 1970-01-01
    • 2012-12-07
    • 2018-10-25
    • 1970-01-01
    • 2015-04-28
    • 2012-02-04
    相关资源
    最近更新 更多