Sử dụng isKindOfClass với Swift


231

Tôi đang cố gắng chọn một chút Swift lang và tôi đang tự hỏi làm thế nào để chuyển đổi Objective-C sau đây thành 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
    }
}

Cụ thể hơn tôi cần biết cách sử dụng isKindOfClasstrong cú pháp mới.

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

    ???

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

    }
}

Câu trả lời:


480

Toán tử Swift thích hợp là is:

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

Tất nhiên, nếu bạn cũng cần gán chế độ xem cho một hằng số mới, thì if let ... as? ...cú pháp là cậu bé của bạn, như Kevin đã đề cập. Nhưng nếu bạn không cần giá trị và chỉ cần kiểm tra loại, thì bạn nên sử dụng istoán tử.


2
Hoạt động với Swift 3 là tốt!
footyapps27

Hoạt động với Swift 4.2 là tốt!
Ravi

Làm thế nào bạn có thể làm điều này trong một câu lệnh chuyển đổi để kiểm tra một số loại lớp khác nhau?
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)
    {

    }
}

Biên tập

Như đã chỉ ra trong câu trả lời của @ Kevin , cách chính xác sẽ là sử dụng toán tử đúc kiểu tùy chọn as?. Bạn có thể đọc thêm về nó trên phần Optional Chainingphụ Downcasting.

Chỉnh sửa 2

Như người dùng @KPM đã chỉ ra câu trả lời khác , sử dụng istoán tử là cách đúng đắn để làm điều đó.


Quên siêu trong tôi. Bạn cũng có thể lấy ra cái : UITouchnày, vì suy luận kiểu sẽ biết nó là gì bởi as UITouchdàn diễn viên
Malcolm Jarvis

@MalcolmJarvis nó không đau khi có nó.
Rui Peres

4
Ăn cắp đại diện của người dùng khác bằng cách đưa câu trả lời của họ vào bạn là không hợp lý.
devios1

không hoạt động. Gợi ý UIPickerView.self. Nó có đúng không?
Vyachaslav Gerchicov

49

Bạn có thể kết hợp kiểm tra và bỏ thành một tuyên bố:

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

Sau đó, bạn có thể sử dụng pickertrong ifkhối.


3
Đây là câu trả lời "chính xác hơn" vì nó sử dụng Swift 'as?' nhà điều hành. Tài liệu nói rằng "Trong Objective-C, bạn sử dụng phương thức isKindOfClass: để kiểm tra xem một đối tượng có thuộc loại lớp nhất định hay không và phương thức tuân thủ ToProtocol: để kiểm tra xem một đối tượng có tuân thủ giao thức đã chỉ định hay không. Trong Swift, bạn hoàn thành việc này tác vụ bằng cách sử dụng toán tử is để kiểm tra một loại hoặc toán tử as? để downcast đến loại đó. " Tài liệu của Apple
Adam Fox

Đây là cách thực hiện đúng của isKingOfClass trong swift. Bạn sẽ chỉ nhập khối if nếu đối tượng thuộc lớp UIPickerView! Câu trả lời chính xác!
Florian Burel

Chỉ muốn chỉ ra rằng nếu bạn chỉ cần thực hiện kiểm tra và không sử dụng 'bộ chọn' trong khối 'if' tiếp theo, thì bạn sẽ muốn sử dụng: if let _ = touch.view as? UIPickerView {...}
Adam Freeman

@AdamFreeman trong trường hợp đó, bạn nên sử dụng tốt hơnif touch.view is UIPickerView {...}
Kevin

Và tôi không chắc chắn ishoặc _tồn tại tại thời điểm câu hỏi này được hỏi, một vài ngày sau khi ngôn ngữ được công bố lần đầu tiên.
Kevin

1

Tôi sẽ dùng:

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

Một cách tiếp cận khác sử dụng cú pháp Swift 2 mới là sử dụng bảo vệ và lồng tất cả trong một điều kiện.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.