2016-02-16 12 views
10

これはなぜ機能しないのですか? String上でarray.contains()を使うことはできますが、Objectでは動作しません。Swift 2 Arrayオブジェクトが含まれていますか?

var array = ["A", "B", "C"] 

array.contains("A") // True 

class Dog { 
    var age = 1 
} 

var dogs = [Dog(), Dog(), Dog()] 
var sparky = Dog() 
dogs.contains(sparky) // Error Cannot convert value of type 'Dog' to expected argument type '@noescape (Dog) throws -> Bool 

答えて

13

あなたDogEquatableを実装する必要があります。本当にArray上の2つのcontains方法がある私たちが理解する必要があります最初、そこに何が起こっているのか説明すること

class Dog: Equatable { 

    var age = 1 

} 

func == (lhs: Dog, rhs: Dog) -> Bool { 
     return lhs.age == rhs.age 
} 
+0

全く役に立たない –

9

(以上はSequenceTypeに、言いました)。制約

Generator.Element : Equatable 

func contains(@noescape _ predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool 

func contains(_ element: Self.Generator.Element) -> Bool 

最初のものは、基本的==を使用して、アレイ内の特定の要素を検索します。 2番目の要素は、要素を検索するためにBoolを返すクロージャを使用します。

DogEquatableを採用していないため、最初の方法は使用できません。コンパイラは2番目のメソッドを使用しようとしますが、1つはパラメータとしてクロージャを持っているため、表示されているエラーです。

ソリューション:Dogの場合はEquatableを実装してください。あなたは、あなたがこのコードはのために含まれているユーザはオブジェクトを使用していない場合

let result = dogs.contains({ $0 === sparky }) 
+0

ありがとうございます。 –

+0

オブジェクト参照を検索することはできません。 –

+0

@ user752543クロージャを使用している場合はあります。私の編集を参照してください。 – Sulthan

2

スウィフト:あなたがオブジェクト参照の比較のために探している場合

は、あなたが簡単なクロージャを使用することができます。

let elements = [ 10, 20, 30, 40, 50] 

if elements.contains(50) { 

    print("true") 

} 

NSObjectクラスを迅速に使用している場合。この変数は私の要求に従っています。あなたの要件を変更することができます。

var cliectScreenList = [ATModelLeadInfo]() 
var cliectScreenSelectedObject: ATModelLeadInfo! 

これは同じデータ型です。

{ $0.user_id == cliectScreenSelectedObject.user_id } 

AnyObject型にしたい場合。

{ "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" } 

詳しい条件この答えはOPの質問には関係ありませんが、スウィフトのエラーメッセージに直面している他の人に役立つかもしれない

if cliectScreenSelected.contains({ $0.user_id == cliectScreenSelectedObject.user_id }) == false { 

cliectScreenSelected.append(cliectScreenSelectedObject) 

print("Object Added") 

} else { 

print("Object already exists") 

} 
0

「呼び出すことができません引数の型リスト付き '(何でも)'

最初にクイッククイズ:ここで問題を見つけることができますか?

internal class FrameworkAdminConnections { 

    private var _localConnectionKeys = [Int]() 

    ... other code omitted 

    public func isLocalConnection(_ connectionKey : Int) { 
     return _localConnectionKeys.contains(connectionKey) 
    } 
} 

スウィフトは非常に助けにならないエラーメッセージが表示されたタイプ(INT)の引数リスト、と)(私は呼び出すことができなかった私に含ま言い続け、私はそれが私にかかった時間を認める勇気がありませんついにそれを理解する。私は愚か指定されていないと思いますので、 - isLocalConnection()メソッドのシグネチャの「 - >ブール」

本当の問題はスウィフトの推論エンジンは、結果は()メソッドはあるべき含まれているかを把握できなかったということでした!

関連する問題