Swift通用序列可观察的歧义

时间:2018-10-05 23:34:48

标签: swift generics rx-swift

我有以下代码

protocol NamedOption {
    var optionTitle: String { get }
}

struct DebugOption: NamedOption {
    let optionTitle: String
    let debugViewControllerType = UIViewController.self
}


func testFunk<T: Sequence>(d: Observable<T>) where T.Element == NamedOption {

}

func bindFullResultsRx() {
    let dd: Observable<[DebugOption]> = self.dataModel.debugOptions // this is defined and properly assigned earlier
    testFunk(d: dd)
}

在我调用testFunk的行中,Xcode给我以下错误:

  

表达式类型'()'不明确,没有更多上下文

我不知道为什么会这样:(到目前为止,我可以通过将testFunk的约束更改为这样来使它起作用:

func funk<T: NamedOption>(d: Observable<[T]>) {

}

在我看来,比顶部的版本更具限制性。有谁知道如何使其与T: Sequence一起使用?

Xcode版本为9.4,Swift版本为4.1。

2 个答案:

答案 0 :(得分:1)

在工作同事的帮助下,我进行了一些挖掘和帮助,只需将==更改为:就可以使其正常工作

func testFunk<T: Sequence>(d: Observable<T>) where T.Element: NamedOption {

}

这只是快速语法的问题 https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html

  

一致性要求→类型标识符:协议组成类型

答案 1 :(得分:0)

OO和泛型不能同时发挥出色。为了执行您想要的操作,您必须按照以下步骤进行手动投射:

testFunk(d: dd.map { $0.map { $0 as NamedOption } })