2015-11-27 69 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

相關問題