1

Я следующий код:протокол Имея общие функции и associatedType

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' 

ответ

0

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

Version 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") 

Version 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") 
Смежные вопросы