Быстрая родовая последовательность наблюдаемой неоднозначности - PullRequest
0 голосов
/ 06 октября 2018

У меня есть следующий код

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 выдает мне следующую ошибку:

Тип выражения '()' isдвусмысленно без контекста

Понятия не имею, почему это происходит :( До сих пор я мог заставить его работать, изменив ограничения на testFunk на это:

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

}

которая кажется мне более строгой, чем версия вверху. Кто-нибудь знает, как заставить ее работать с T: Sequence?

Версия Xcode - 9.4, версия Swift - 4.1.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

После некоторого поиска работы и помощи со стороны коллег по работе я смог заставить ее работать, просто изменив == на :, чтобы он выглядел следующим образом

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

}

Это просто вопрос быстрого синтаксиса https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html

требование соответствия → идентификатор типа: тип состава протокола

0 голосов
/ 06 октября 2018

ОО и дженерики не слишком хорошо играют вместе.Для того, чтобы делать то, что вы хотите, вы должны вручную выполнить приведение, как в:

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