Как использовать общий протокол в сигнатуре метода? - PullRequest
0 голосов
/ 03 июня 2018

В контексте у меня есть класс A, который имеет много свойств, но я хочу показать только некоторые из них, и один из них является универсальным типом.

Затем я пытаюсь использовать общий протокол (может быть, это неправильное имя?) Для A.

Это нормально, но когда я пытаюсь использовать протокол вместо структуры в методене скомпилируется.

Есть предложения?

protocol AProtocol {
    associatedtype T

    var t: T? { get }
}

struct A<Type>: AProtocol {
    typealias T = Type
    var t: Type?

    var a: Int
    var b: Int
    var c: Int
    var d: Int
    var e: Int
}

struct Main {
    func show<T: Decodable>(a: AProtocol<T>) { // error: Cannot specialize non-generic type 'AProtocol'

    }
}

РЕДАКТИРОВАТЬ:

Ниже приведен фрагмент кода после того, как я обновил ответ @ Sweeper, есть небольшая настройка дляреализация, потому что изначально в моем проекте это закрытие.

protocol AProtocol {
    associatedtype T

    var t: T? { get }
}

struct A<Type>: AProtocol {
    typealias T = Type
    var t: Type?

    var a: Int?
    var b: Int?
    var c: Int?
    var d: Int?
    var e: Int?
}

struct Main {
    func show<T, U>(completion: (U) -> Void) where T: Decodable, U: AProtocol, U.T == T {
        let a = A<Int>()
        completion(a) //error: '(A<Int>) -> Void' is not convertible to '(U) -> Void'
    }
}

Не могли бы вы объяснить, почему это не сработает?

1 Ответ

0 голосов
/ 03 июня 2018

Нельзя использовать протокол с такими типами.Протоколы со связанными типами не совпадают с общими протоколами.Последний не существует в Swift.

В этой ситуации вы обычно вводите новый универсальный параметр U в метод и ограничивает его протоколом:

func show<T, U>(a: U) where T: Decodable, U : AProtocol, U.T == T {

}

3 ограничения:

  • T должно соответствовать Decodable
  • U должно соответствовать AProtocol
  • U.T должно бытьтак же, как T

Имеет смысл, верно?

...