Swift generi c проблема протокола - PullRequest
2 голосов
/ 18 февраля 2020

У меня странная проблема при реализации протокола 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. Кто-нибудь может объяснить это? Кроме того, есть ли способ достичь того, что я пытаюсь сделать здесь?

...