Swift 4.1中能否自定义继承Array的Nodes类?编译报错求解
为什么不能继承Swift的Array?怎么实现你的需求?
你遇到的这个编译错误,核心原因是Swift里的Array是结构体(struct)而不是类(class),而Swift的结构体属于值类型,不支持继承机制——这就是错误提示里说的:
Inheritance from non-protocol, non-class type 'Array'
的本质。
那怎么实现你想要的自定义"Nodes"集合呢?有两种常用方案:
方案1:扩展Array(推荐,适合给Node数组加专属功能)
如果你的需求只是给存放Node类型的数组增加一些自定义方法/属性,直接用extension扩展Array并限定元素类型为Node就可以了,不需要继承:
class Node { /* 你的Node实现 */ } extension Array where Element == Node { // 添加自定义方法,比如根据ID查找节点 func findNodeById(_ id: String) -> Node? { return first { /* 这里写ID匹配逻辑 */ } } // 添加自定义属性,比如筛选活跃节点 var activeNodes: [Node] { return filter { /* 这里写活跃判断逻辑 */ } } } // 使用时直接用[Node]类型,自动拥有扩展的功能 let nodes: [Node] = [Node(), Node()] let activeNodes = nodes.activeNodes
方案2:组合Array(适合需要独立自定义类型的场景)
如果你确实需要一个名为Nodes的独立类型(而非直接用[Node]),可以用**组合(Composition)**的方式:把Array<Node>作为Nodes类的内部属性,对外暴露你需要的方法,甚至模拟数组的下标访问:
class Node { /* 你的Node实现 */ } class Nodes { private var storage: [Node] = [] // 模拟数组的下标访问 subscript(index: Int) -> Node { get { storage[index] } set { storage[index] = newValue } } // 暴露数组常用方法,比如添加元素 func append(_ node: Node) { storage.append(node) } // 添加你的自定义业务方法 func batchUpdateStatus(to status: Bool) { // 自定义批量更新逻辑 } // 还可以实现Collection协议,让Nodes拥有标准集合的所有特性 } // 使用方式 let myNodes = Nodes() myNodes.append(Node()) let firstNode = myNodes[0] myNodes.batchUpdateStatus(to: true)
简单总结:Swift里值类型(struct、enum)都不支持继承,所以不能继承Array。根据你的实际需求,选择扩展或者组合的方式就能实现自定义集合的功能。
内容的提问来源于stack exchange,提问作者hopy
相关产品推荐
相关产品推荐

