【问题标题】:Extension of Set where element is an Array of a specific typeSet 的扩展,其中元素是特定类型的数组
【发布时间】:2015-11-27 12:25:45
【问题描述】:

我想为 Set 结构添加一个扩展,但前提是 Set 的元素是一个 NSOperations 数组。有可能吗?

我想写这样的东西,但它不是有效的代码:

extension Set where Element : Array<NSOperation> { }

因为type 'Element' constrained to non-protocol type 'Array&lt;NSOperation&gt;。所以我想创建一个协议并用这个协议扩展 NSOperations 数组:

protocol ArrayOfOperations { }
extension Array : ArrayOfOperations where Element : NSOperation { }

它也不起作用,因为Extension of type 'Array' with constraints cannot have an inheritance clause

所以我有点迷路了。你有什么想法,如何解决这个问题?

【问题讨论】:

  • 您将如何构建“NSOperations 数组集”(Set&lt;[NSOperation]&gt;)? [NSOperation] 不是 Hashable
  • @MartinR import Foundation let op = NSOperation() var arr: Array = [] arr.append(op) let set = Set(arr)
  • @user3441734:从数组中创建一个集合并为您提供“NSOperation 集合”,而不是“NSOperation 数组集合”。
  • 啊哈,对不起...数组不是可哈希的,你是对的

标签: swift swift2


【解决方案1】:

由于您无法使Array&lt;NSOperation&gt; 符合Hashable,因此您必须创建一个小型包装结构。

例如

struct NSOperationList {

    var operations = [NSOperation]()
}

然后在NSOperationList 之上构建您需要的所有功能。
所以如果你想添加对Set的支持:

extension NSOperationList: Hashable {

    var hashValue: Int {
       return operations.reduce(0) { $0 ^ $1.hashValue }
    }
}

func == (a: NSOperationList, b: NSOperationList) -> Bool {
    return a.operations == b.operations
}

【讨论】:

  • 对不起,我不明白 OP 问题。你是对的!
【解决方案2】:
import Foundation

let op = NSOperation()
var arr: Array<NSOperation> = []
arr.append(op)
let set = Set(arr)

我不知道你的问题是什么,但是上面的sn-p编译没有任何问题

【讨论】:

  • 对不起,我不明白 OP 问题...我的错误。流体声波答案是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多