说你有
struct Screw: Codable {
let id: String
.. more
}
struct Nail: Codable {
let id: String
.. more
}
然后
struct Parts: Codable {
var Screws: [Screw]?
var Nails: [Nail]?
}
以及可选阵列的扩展
extension Optional {
mutating func blah() where Wrapped == [Screw] {
if self == nil { self = [] }
// we use the .id property ..
if self!.count > 13 && self![13].id == 666 { self?.remove(at: 13) }
}
}
然后就可以方便地
stuff.parts.Screws.blah()
但是如果我明智的话
protocol IDable {
var id: Int { get }
}
struct Screw: Codable, IDable { ..
struct Nail: Codable, IDable { ..
看来你可以不能这样做,
extension Optional {
mutating func blah() where Wrapped == [IDable] { ..
因为在编译时
stuff.parts.Screws.blah()
实例方法 'blah()' 要求类型 '[Screw]' 和 '[any IDable]' 等效
有没有办法实现这个目标?
将链接问题的解决方案封装起来,对于这个实际情况,解决方案是......
mutating func blah() where Wrapped == [Screw] {
成为
mutating func blah<T: IDable>() where Wrapped == [T] {
或
mutating func bleh(item: Screw) where Wrapped == [Screw] {
成为
mutating func bleh<T: IDable >(item: T) where Wrapped == [T] {