2017-02-16 19 views
0

私はプロトコルを持っている:スイフト3:配列内のオブジェクトのインデックスを見つけるにはどうすればよいですか?

protocol MyProtocol : NSObjectProtocol { 
    func MyProtocolUpdated()  
} 

私はプロトコルの配列を持っている:

var delegates = Array<DataManagerDelegate>() 

は、今私は、プロトコルの配列から特定の要素を削除します。 私は delegates.remove(at: Int) メソッドを使用しなければならないと思います。これを行うには

、私は配列から特定のオブジェクトを削除するにはどうすればよいdelegates.index(of: delegate)

But i'm getting the error "cannot invoke 'index' with an argument list of type '(of: MyProtocol)'" 

を使用して、オブジェクトのインデックスを検索してみてください?

おかげ

+3

非常に良いアイデアではありません。代理人は、所有サイクルを防ぐために、通常、「弱い」として保存する必要があります。配列は常に強いとしてそれらを格納します... – Sulthan

答えて

0

一つの方法は、関数型プログラミングを使用しているスイフトの配列からオブジェクトを削除します。

delegates.filter({ $0 != objectThatYouwantToRemove }) 

このコードは削除オブジェクトを持たない配列を与えます。

+0

私は ''バイナリ演算子は2つのMyProtocolオペランドには適用できません」と言っています – Alterecho

0

index(of:)機能を持つ要素のインデックスを取得できます。オプションのIntを返すので、アンラップする必要があります。 DataManagerDelegateEquatableに準拠している必要があります。オブジェクトがEquatableに準拠する必要があり、その配列は、あなたが見つけるためにしようとしているものに反復で現在の項目を比較することができ、配列からオブジェクトを見つけるために

if let index = delegates.index(of: delegate) { 
    delegates.remove(at: index) 
} 
+0

しかし、エラーが発生しました ''引数 ' MyProtocol) '"'私が '.index(of:)'を使用している場合' – Alterecho

+0

'MyProtoocol'が' Equatable'に準拠していますか? – Yannick

+0

これは 'Equatable'に準拠させることでそれを試しませんでしたが、' MyProtocol'に準拠したオブジェクトは 'Equatable'にも準拠するべきではありませんか?私はMyProtocolのアダプターをEquatableに適合させたくありません。 – Alterecho

0

extension DataManagerDelegate: Equatable { }

そしてDataManagerDelegateに準拠するすべてのオブジェクトが

static func ==(lhs: Self, rhs: Self) -> Bool機能を実装する必要があります:あなたはあなたのプロトコルを宣言する場合は、それをする

を追加します。

その後、オブジェクトのインデックスを見つけることができるはずです。

+0

'static func ==(lhs:Self、rhs:Self) - > Bool'関数を実装するオブジェクト(MyProtocolに準拠する必要がある)を作る方法以外はありませんか? – Alterecho

+0

デフォルトでは、私はそれを認識していません。 Equatableに準拠していない場合、配列は要素を比較できないため、正しい要素が何であるかを調べる方法を知らない。 – fdiaz

0

アレイから要素を削除する場合は、Array.filterを使用します。配列内のデリゲートを維持

protocol Shape { 
    var name: String { get set } 
} 

struct Circle: Shape { 
    var name = "" 
} 

struct Triangle: Shape { 
    var name = "" 
} 

var shapes = Array<Shape>() 

var circle1 = Circle(name: "circle1") 
var triangle1 = Triangle(name: "triangle1") 
var triangle2 = Triangle(name: "triangle2") 

shapes.append(circle1) 
shapes.append(triangle1) 
shapes.append(triangle2) 

// we want to remove the circle one so we filter it. 
shapes = shapes.filter { $0.name != circle1.name } 

print(shapes) 
// [Triangle(name: "triangle1"), Triangle(name: "triangle2")] 
+0

しかし、MyProtocolでプロパティがなくても機能するのはどうですか? – Alterecho

関連する問題