gpt4 book ai didi

swift - 从 Swift 中协议(protocol)定义的函数返回泛型

转载 作者:行者123 更新时间:2023-11-30 10:05:59 25 4
gpt4 key购买 nike

我声明了一个带有泛型函数的协议(protocol),但实现它后类型推断似乎无法正常工作。

protocol SearchableRealmModel {
static func search<Self: Object>(needle: String) -> Results<Self>?
}

class Thing: Object, SearchableRealmModel {
class func search<Thing>(needle: String) -> Results<Thing>? {
return realm()?.objects(Thing).filter("name == '\(needle)'")
}
}

let things = Thing.search("hello") // works but inferred type is Results<Object>?

这里的问题是 things 的推断类型是 Results<Object>? 。我意识到可以使用这些变体,

let things: Results<Thing>? = Thing.search("hello")
let things = Thing.search("hello") as Results<Thing>?

但是每次都必须指定类型是相当重复的。

在我的测试中,使用 Results<..>? 以外的其他类型保持类型推断完整。这可能是由于必须在 Self: Object 中指定父类造成的。 (这是必需的,因为 Results )。

感谢任何帮助。

最佳答案

这是 Swift 泛型机制的限制。编译器可以static func search(needle: String) -> Results<Object>? 生成具体签名它满足类型约束,因为 Object子类将与此匹配。您可能可以向 bugs.swift.org 提交错误因为我认为 Swift 核心团队也会认为这是一个错误,即使不是非常意外的行为。

但是,您可以修改代码以使用协议(protocol)扩展来执行您想要的操作:

protocol SearchableRealmModel {}

extension SearchableRealmModel where Self: Object {
static func search(needle: String) -> Results<Self> {
return try! Realm().objects(Self).filter("name == '\(needle)'")
}
}

class Thing: Object, SearchableRealmModel {
dynamic var name = ""
}

let result = Thing.search("thing1") // => inferred as Results<Thing>
print(result.first?.name)

如果您想要 search 的自定义实现对于其他 Realm 模型,您可以在那里重新实现该函数,编译器将优先于协议(protocol)扩展版本:

class OtherThing: Object, SearchableRealmModel {
dynamic var id = ""

static func search(needle: String) -> Results<OtherThing> {
return try! Realm().objects(OtherThing).filter("id == '\(needle)'")
}
}

关于swift - 从 Swift 中协议(protocol)定义的函数返回泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35936731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com