gpt4 book ai didi

swift - 我可以使用内部泛型进行快速扩展吗?

转载 作者:搜寻专家 更新时间:2023-11-01 05:36:56 25 4
gpt4 key购买 nike

我想让 RxSwift 和 Realm 一起工作,我尝试构建函数来帮助我。例如,我不想使用对 Results 对象排序的函数(它给你排序的结果),而是想构建一个直接在 Observable> 上这样做的函数。多亏了 ObservableType 协议(protocol),我设法在非泛型对象上做到了,但找不到以泛型方式做到这一点的方法

这是我的实际代码,它只适用于特定的对象:

public extension ObservableType where E == Results<MyRealmObject> {

public func sorted(key: String, ascending: Bool = true) -> Observable<Results<MyRealmObject>>
{
return self.map { $0.sorted(key, ascending: ascending) }

}
}

如果我用 T 更改 MyRealmObject,编译器会告诉我 T 未声明。我尝试了很多语法,但没有一个有效,我不知道是否可行。

最佳答案

我没有这些框架,但我猜这些类型类似于以下内容:

protocol ObservableType {
associatedtype E
}

class Observable<T> : ObservableType {
typealias E = T
init() {}
}

enum Results<T> {
case None
case Some(T)
}

...在这种情况下你可以尝试:

extension ObservableType {

func sorted <T where Self.E == Results<T>> (/* ... */) -> Observable<Results<T>> {
return /* sorted */ Observable()
}
}

...有效:

let o = Observable<Results<Int>>()
o.sorted() // Observable<Results<Int>>

...但不是最优的,因为:

let x = Observable<Int>()
x.sorted() // compile-time error: Generic parameter `T` could not be infered

... 你更愿意说 Value of type 'Observable<Int>' has no member 'sorted' .尽管错误至少在编译时抛出,但我认为您自己的方法仍然更可取。

只是基于@Denis Laboureyras 评论的事后想法

在尝试我的解决方案时,Denis 无法访问 E 类型的值作为Results<T>没有类型转换因为extension不限制 self 的类型但只有方法的参数。在免费功能的情况下,所有这些问题都会消失(尽管我明白这也不理想):

protocol ObservableType {
associatedtype E
func map <X> (_: E -> X) -> Observable<X>
}

class Observable<T> : ObservableType {
typealias E = T
init() {}
func map <X> (f: E -> X) -> Observable<X> {
return Observable<X>(/* with f(e) */)
}
}

class Results<T> {
func sort(/* ... */) -> Results<T> {
return /* sorted */ self
}
}

func sort <O: ObservableType, T where O.E == Results<T>> (o: O/* ... */) -> Observable<Results<T>> {
return o.map{ $0.sort() }
}

let o = Observable<Results<Int>>()
sort(o) // Observable<Results<Int>>

关于swift - 我可以使用内部泛型进行快速扩展吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311003/

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