2017-02-05 2 views
-1

편집 : 문제는 @vacawama에 의해 이미 해결되었습니다. 그러나 NSObject classes에 대한 대답을 찾으려면 NSObjectProtocolisEqual 함수를 구현해야합니다. 그렇지 않으면 당신은거야 얻을 오류가 말한다 : "Redundant conformance of 'classname' to protocol 'Equatable'"개체가 배열에 있는지 확인하는 방법

당신은 자세한 내용은이를 확인할 수 있습니다 빠른에서 Swift 2.2, Contains Method not working


, 객체가 배열에있는 경우 내가 확인할 수있는 방법?

저는 이처럼 간단한 클래스를 가지고 있습니다.

class Test: { 
    private var _number: Int! 
    private var _type: String! 

    var number: Int { 
      return _number 
    } 
    var type: String { 
      return _type 
    } 

    init (number: Int, type: String) { 
     self._number = number 
     self._type = type 
    } 
} 

또한이 클래스가 있습니다.

class TestRandom { 

    private let _numberArr: [Int] = [1,2,3,4,5,6,7,8,9,10] 
    private let _typeArr: [String] = ["x","y","z"] 
    public private(set) var _testArr: [Test] = [] 
    private var _randomTest: Test! 

    func randomTestPicker() { 
      repeat { 

        let randomNumber = Int(arc4random_uniform(UInt32(self._numberArr.count))) 
        let randomType = Int(arc4random_uniform(UInt32(self._typeArr.count))) 

        self._randomTest = Test(number: self._numberArr[randomNumber], type: self._typeArr[randomType]) 
      } while self._testArr.contains(_randomTest) 
    } 
} 

내가 원하는 것은 다른 개체를 선택하는 것입니다. 내가 _testArr에 x2, y4, x6, z3, z8, y2 있다고 가정 해 보겠습니다. randomTestPicker를 호출하면 x2 또는 z8을 선택해서는 안됩니다. 이미 배열되어 있기 때문입니다.

나는 포함되어있는 것을 보았습니다. 그러나 그것은 나를 위해 작동하지 않았다. 이 목적으로 사용할 수있는 솔루션이 있습니까? 또는 이것을 수행하는 가장 좋은 방법은 무엇입니까?

편집 : self._testArr.contains{$0 === _randomTest}을 시도했지만 둘 다 작동하지 않습니다.

+0

[스위프트 2 배열에 개체가 포함되어 있습니까?] (http://stackoverflow.com/questions/35443308/swift-2-array-contains-object) – Hamish

답변

3

클래스가 Equatable 프로토콜을 준수하지 않으므로 을 사용할 수 없습니다.

는 클래스 정의에 :Equatable를 추가하고 두 개체를 비교 == 기능을 구현 :이 작업이 완료 될 수 있었다

class Test: Equatable { 
    private var _number: Int! 
    private var _type: String! 

    var number: Int { 
     return _number 
    } 
    var type: String { 
     return _type 
    } 

    init (number: Int, type: String) { 
     self._number = number 
     self._type = type 
    } 
} 

func ==(lhs: Test, rhs: Test) -> Bool { 
    return lhs.number == rhs.number && lhs.type == rhs.type 
} 

다른 방법은의에 포함 된 술어 양식을 사용하는 것입니다. 술어는 두 개의 오브젝트를 취하여 일치하는지 나타내는 Bool을 리턴합니다. 이 경우에는 작성합니다

self._testArr.contains { $0.number == _randomTest.number && $0.type == _randomTest.type } 

을 당신이 볼 수 있듯이,이 경우 폐쇄 그래서 Equatable 프로토콜을 할 수있는 청소기 방법입니다 구현, 기본적으로 위에서 == 기능입니다.

클로저 { $0 === _randomTest }은 개체가 동일한 경우에만 테스트합니다. 인스턴스입니다. 귀하의 경우 두 개의 객체가 동일한 속성을 갖고 있는지 확인해야하며 동일한 인스턴스 인 경우 관심이 없습니다. 객체를 만드는 방법으로 이미 배열에있는 인스턴스를 만들지 않으므로이 검사는 항상 false을 반환합니다.

+0

신속하고 이해할 수있는 응답을 해주셔서 감사합니다. 그것은 완벽하게 작동합니다. – Taha

관련 문제