使用协议而不是结构作为(可选数组)扩展?

问题描述 投票:0回答:1

说你有

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]' 等效

有没有办法实现这个目标?

ios protocols extension-methods swift5
1个回答
0
投票

将链接问题的解决方案封装起来,对于这个实际情况,解决方案是......

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] {
© www.soinside.com 2019 - 2024. All rights reserved.