Протокол, имеющий общую функцию и связанный тип

У меня такой код:

protocol NextType {
    associatedtype Value
    associatedtype NextResult

    var value: Value? { get }

    func next<U>(param: U) -> NextResult
}

struct Something<Value>: NextType {

    var value: Value?

    func next<U>(param: U) -> Something<Value> {
        return Something()
    }
}

Теперь проблема в Something реализации next. Я хочу вернуть Something<U> вместо Something<Value>.

Но когда я это сделаю, я получил следующую ошибку.

type 'Something<Value>' does not conform to protocol 'NextType'
protocol requires nested type 'Value'

person mohamede1945    schedule 30.07.2016    source источник


Ответы (1)


Я протестировал следующие коды, и они компилируются (Xcode 7.3 - Swift 2.2). В этом состоянии они не очень полезны, но я надеюсь, что это поможет вам найти нужную окончательную версию.

Версия 1

Поскольку Something определяется с помощью V, я думаю, вы не можете вернуть только Something<U>. Но вы можете переопределить Something, используя U и V следующим образом:

protocol NextType {
    associatedtype Value
    associatedtype NextResult

    var value: Value? { get }

    func next<U>(param: U) -> NextResult
}

struct Something<V, U>: NextType {
    typealias Value = V
    typealias NextResult = Something<V, U>

    var value: Value?

    func next<U>(param: U) -> NextResult {
        return NextResult()
    }
}

let x = Something<Int, String>()
let y = x.value
let z = x.next("next")

Версия 2

Или просто определите Something с помощью V:

protocol NextType {
    associatedtype Value
    associatedtype NextResult

    var value: Value? { get }

    func next<U>(param: U) -> NextResult
}

struct Something<V>: NextType {
    typealias Value = V
    typealias NextResult = Something<V>

    var value: Value?

    func next<V>(param: V) -> NextResult {
        return NextResult()
    }
}

let x = Something<String>()
let y = x.value
let z = x.next("next")
person ghashi    schedule 17.09.2016