ใช้ isKindOfClass กับ Swift


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

ผู้ประกอบการ Swift ที่เหมาะสมคือ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)
    {

    }
}

แก้ไข

เป็นแหลมออกใน@ คำตอบของเควิน , as?วิธีที่ถูกต้องที่จะใช้ประกอบการหล่อเลือกประเภท คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในส่วนส่วนย่อยOptional ChainingDowncasting

แก้ไข 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
นี่คือคำตอบที่ "ถูกต้องมากกว่า" เพราะใช้ Swift 'as?' ผู้ประกอบการ เอกสารระบุว่า "ใน Objective-C คุณใช้เมธอด isKindOfClass: เพื่อตรวจสอบว่าวัตถุมีประเภทคลาสที่แน่นอนหรือไม่และเมธอด conformsToProtocol: เพื่อตรวจสอบว่าวัตถุนั้นสอดคล้องกับโปรโตคอลที่ระบุหรือไม่ใน Swift คุณสามารถทำสิ่งนี้ได้ งานโดยใช้ตัวดำเนินการ is เพื่อตรวจสอบชนิดหรือตัวดำเนินการ as เพื่อลดค่าลงในประเภทนั้น " เอกสารประกอบของ Apple
Adam Fox

นี่เป็นวิธีที่เหมาะสมในการแสดง isKingOfClass อย่างรวดเร็ว คุณจะเข้าสู่ if block เฉพาะเมื่อวัตถุนั้นเป็นของคลาส UIPickerView! คำตอบที่ดี!
Florian Burel

แค่ต้องการชี้ให้เห็นว่าถ้าคุณเพียงแค่ต้องทำการตรวจสอบและไม่ใช้ 'ตัวเลือก' ในบล็อก 'if' ที่ตามมาคุณจะต้องใช้: ถ้าให้ _ = touch.view เป็น? UIPickerView {... }
Adam Freeman

@AdamFreeman ในกรณีนี้คุณควรจะใช้มันให้ดีกว่านี้if touch.view is UIPickerView {...}
เควิน

และฉันไม่แน่ใจว่ามีอยู่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 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.