Swift와 함께 isKindOfClass 사용


231

Swift lang을 가져 오려고하는데 다음 Objective-C를 Swift로 변환하는 방법이 궁금합니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];

    if ([touch.view isKindOfClass: UIPickerView.class]) {
      //your touch was in a uipickerview ... do whatever you have to do
    }
}

보다 구체적으로, 나는 isKindOfClass새로운 구문에서 사용하는 방법을 알아야 합니다.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    ???

    if ??? {
        // your touch was in a uipickerview ...

    }
}

답변:


480

올바른 스위프트 연산자는 is다음과 같습니다.

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

물론, 새로운 상수에 뷰를 할당해야한다면 if let ... as? ..., 케빈이 언급 한 것처럼 구문이 당신의 소년입니다. 그러나 값이 필요하지 않고 유형을 확인하기 is만하면 연산자를 사용해야합니다 .


2
Swift 3에서도 작동합니다!
footyapps27

Swift 4.2에서도 작동합니다!
Ravi

switch 문에서 여러 가지 클래스 유형을 확인하려면 어떻게해야합니까?
BigBoy1337

132
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if touch.view.isKindOfClass(UIPickerView)
    {

    }
}

편집하다

@Kevin의 답변 에서 지적했듯이 올바른 방법은 선택적 유형 캐스트 ​​연산자를 사용하는 것 as?입니다. 자세한 내용은 Optional Chaining하위 섹션 섹션을 참조하십시오 Downcasting.

편집 2

사용자 @KPM다른 답변 에서 지적했듯이 is연산자를 사용하는 것이 올바른 방법입니다.


내 슈퍼를 잊었다. : UITouch유형 추론은 as UITouch캐스트에 의해 그것이 무엇인지 알 수 있기 때문에 이것 중 하나를 꺼낼 수도 있습니다.
Malcolm Jarvis

@ MalcolmJarvis 그것은 그것을 다치게하지 않습니다.
Rui Peres

4
자신의 답변을 다른 사용자의 답변을 훔치는 것은 맛이 좋지 않습니다.
devios1

작동하지 않습니다. 제안 UIPickerView.self합니다. 맞습니까?
Vyachaslav Gerchicov

49

수표를 결합하여 하나의 명세서로 캐스트 할 수 있습니다.

let touch = object.anyObject() as UITouch
if let picker = touch.view as? UIPickerView {
    ...
}

그런 다음 블록 picker내에서 사용할 수 있습니다 if.


3
이것은 스위프트 'as?'를 사용하기 때문에 "보다 정확한"답변입니다. 운영자. 문서는 "Objective-C에서 isKindOfClass : 메소드를 사용하여 객체가 특정 클래스 유형인지 여부를 확인하고 conformsToProtocol : 메소드를 사용하여 객체가 지정된 프로토콜을 준수하는지 여부를 확인합니다. Swift에서는 다음을 수행합니다. is 연산자를 사용하여 유형을 확인하거나 as? 연산자를 사용하여 해당 유형으로 다운 캐스트합니다. " 애플 문서
Adam Fox

이것은 isKingOfClass를 신속하게 수행하는 올바른 방법입니다. 객체가 UIPickerView 클래스 인 경우에만 if 블록을 입력합니다. 좋은 대답입니다!
Florian Burel 2018 년

그냥 확인하고 후속 'if'블록에서 'picker'를 사용하지 않으면 다음을 사용하고 싶을 것입니다. if let _ = touch.view as? UIPickerView {...}
Adam Freeman

이 경우 @AdamFreemanif touch.view is UIPickerView {...}
Kevin

그리고 나는 언어가 처음 발표 된 후 며칠 동안이 질문이 제기 된 시점에서 확실하지 is않거나 _존재 하지 않았습니다 .
케빈

1

나는 사용할 것이다 :

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if let touchView = touch.view as? UIPickerView
    {

    }
}

-3

새로운 Swift 2 구문을 사용하는 또 다른 방법은 guard를 사용하여 하나의 조건에 중첩시키는 것입니다.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.