Как инициализировать сохраненное свойство, которое имеет тип протокола ассоциированного типа - PullRequest
0 голосов
/ 29 февраля 2020
protocol Identifiable {
    associatedtype ID
    func identifier() -> ID
}

protocol PersonProtocol: Identifiable {
    var name: String { get }
    var age: Int { get }
}

class Person: PersonProtocol {
    let name: String
    let age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func identifier() -> String {
        return "\(name)_\(age)"
    }
}

Я попытался объявить и инициализировать сохраненное свойство как let owner: PersonProtocol в классе Car, но оно выдало ошибку:

`PersonProtocol 'может использоваться только как обобщенный c ограничение, потому что оно имеет Self или связанные требования типа

enter image description here Следовательно, я попытался выполнить следующий фрагмент кода, чтобы сделать то же самое, но я не уверен, что это правильный способ сделать это. Нужны предложения.

class Car<T: PersonProtocol>{
    let owner: T
    init<U: PersonProtocol>(owner: U) where U.ID == String {
        self.owner = owner as! T // I am force casting `U` as `T`. is this forcecasting justified ?
    }

    func getID() -> String {
        owner.identifier() as! String // is this forcecasting justified ?
    }
}

1 Ответ

0 голосов
/ 29 февраля 2020
class Car<U,T: PersonProtocol> where T.ID == U{
    let owner: T
    init(owner: T) {
        self.owner = owner
    }

    func getID() -> U {
        owner.identifier()
    }
}

let person = Person(name: "John Snow", age: 34)
let car = Car<String, Person>(owner: person)

...