2015-11-27 74 views
0

我想向Set结构添加扩展,但仅限于Set的元素是NSOperations数组。可能吗?Set的扩展其中元素是特定类型的数组

我想写这样的事情,但它不是一个有效的代码:

extension Set where Element : Array<NSOperation> { } 

因为type 'Element' constrained to non-protocol type 'Array<NSOperation>。所以,我想创造一个协议,延长NSOperations的阵列与此协议:

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

它不工作,或者是因为Extension of type 'Array' with constraints cannot have an inheritance clause

所以我有点失落在这里。你有一些想法,如何解决这个问题?

+0

你将如何构建一个“集NSOperations数组“('Set <[NSOperation]>')? '[NSOperation]'不是'Hashable'。 –

+0

@MartinR进口基金会 让OP =的NSOperation() VAR ARR:数组 = [] arr.append(OP) 设置成集(ARR) – user3441734

+0

@ user3441734:那从创建数组一组,让您一套“NSOperation”,而不是“NSOperation数组”。 –

回答

2

由于你不能让Array<NSOperation>符合Hashable你必须做一个小的包装结构。

E.g.

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 
} 
+0

let arr:Array = []是合法表达!!! – user3441734

+0

对不起,我不明白OP的问题。你是对的! – user3441734

-1
import Foundation 

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

我不知道什么是你的麻烦,但上面的代码编译没有任何麻烦

+0

对不起,我不明白OP问题......我的错误。流体解答的答案是正确的 – user3441734

相关问题