swift - 如何初始化关联类型协议类型的存储属性
问题描述
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' 只能用作通用约束,因为它具有 Self 或关联的类型要求
因此,我尝试按照一段代码来做同样的事情,但我不确定这是否是正确的方法。需要建议。
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 ?
}
}
解决方案
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)
推荐阅读
- generics - 将 Rust 泛型约束到自定义数据类型
- jenkins - Jenkins 构建历史消失了
- function - 根据喜好获取号码
- android - 使用从后端获取的图像在运行时更改徽标应用程序移动设备
- sql - 如何在 PostgreSQL 数据库中更新 JSONB 数组中的“键”
- python-3.x - Python3 与 requests_html Cywin 下的问题
- java - 如何使用 Stream 检查所有 JComponents 是否为空
- python - 使用两种不同方法的线性回归;代码中的错误
- syntax - Xtext:为 DSL 定义语法糖
- python - Ceasar Cipher 对符号和空格产生错误的结果