У меня странная проблема при реализации протокола Swift generi c.
Пожалуйста, обратитесь к этому фрагменту кода игровой площадки.
import Foundation
protocol FooProtocol {
static func foo() -> String
}
struct Outer<T: FooProtocol>: FooProtocol {
static func foo() -> String {
return T.foo()
}
}
struct Inner<T>: FooProtocol {
static func foo() -> String {
return "default. T is \(T.self)"
}
}
extension Inner where T == String {
static func foo() -> String {
return "Inner String"
}
}
extension Inner where T == Int {
static func foo() -> String {
return "Inner Int"
}
}
print(Inner<Int>.foo())
print(Outer<Inner<Int>>.foo())
print(Inner<String>.foo())
print(Outer<Inner<String>>.foo())
Результат этого
Inner Int
default. T is Int
Inner String
default. T is String
Результат, который я ожидал:
Inner Int
Inner Int
Inner String
Inner String
Что меня беспокоит, так это то, что Inner
struct полностью работает. Он включается в реализацию по умолчанию, если он содержится в Outer
struct. Кто-нибудь может объяснить это? Кроме того, есть ли способ достичь того, что я пытаюсь сделать здесь?