cuốn sách gpt4 ai đã làm

Giao thức Swift thực hiện một giao thức @objc khác

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 09:21:53 32 4
mua khóa gpt4 Nike

Sử dụng Swift 4, tôi đang cố gắng viết một giao thức tùy chỉnh cung cấp sự phù hợp với giao thức @objc.

một số mã

Cụ thể hơn, tôi có một giao thức tùy chỉnh Có thể tìm kiếm, cung cấp giao thức UIKit UISearchBarDelegate Cách triển khai đơn giản chỉ yêu cầu triển khai lệnh gọi lại để xử lý các thay đổi của bộ lọc tìm kiếm.

Giao thức @objc Có thể tìm kiếm: class, UISearchBarDelegate {
@objc func searchFilterChanged(_: String?)
}

Tôi cung cấp việc triển khai đại biểu trong phần mở rộng giao thức:

tiện ích mở rộng Có thể tìm kiếm được {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchFilterChanged(searchText)
}
// .. và một số phương thức ủy nhiệm khác
}

Cuối cùng, trong một tiện ích mở rộng khác, tôi đã tạo và cài đặt thanh tìm kiếm (cài đặtSearchBar Phải được lấy từ Bộ điều khiển xem cụ thể viewDidLoad gọi):

tiện ích mở rộng Có thể tìm kiếm ở nơi Tự: UITableViewController {
chức năng cài đặtSearchBar() {
hãy để searchBar = UISearchBar()
searchBar.delegate = tự
tableView?.tableHeaderView = searchBar
}
}

câu hỏi

Thật không may, khi người dùng nhập văn bản vào thanh tìm kiếm,UISearchBarDelegate Phương thức ủy nhiệm sẽ không được gọi. Trình biên dịch đã cảnh báo tôi bằng thông báo này:

Phương thức không phải '@objc' 'searchBar(_:textDidChange:)' không đáp ứng yêu cầu tùy chọn của giao thức '@objc' 'UISearchBarDelegate'

Tuy nhiên, tôi không thể chuyển đổi @objc vào phương thức vì điều này sẽ gây ra lỗi trình biên dịch sau:

@objc chỉ có thể được sử dụng với các thành viên của lớp, giao thức @objc và phần mở rộng cụ thể của lớp

câu hỏi

Vì vậy, bây giờ câu hỏi của tôi là: liệu có thể đạt được hành vi mong muốn trong Swift hay không, hay không thể đạt được sự tuân thủ với giao thức @objc trong một giao thức khác?

Lưu ý 1: Tôi biết điều này có thể đạt được bằng cách sử dụng các lớp con; tôi vẫn đang tìm phiên bản POP.

Lưu ý 2: Tôi biết UISearchController Cũng giúp đơn giản hóa việc thực hiện tìm kiếm; Tôi không thể sử dụng lớp này vì trong mã thực tế của tôi, tôi có chế độ xem bộ lọc phức tạp hơn và các điều khiển khác - đó là những gì tôi sử dụng trần trụi UISearchBar 的原因。

câu trả lời hay nhất

Điều này là do thời gian chạy Obj-C sử dụng công văn động (tra cứu/chuyển thông báo động) để tuân thủ đối tượng nhằm biết liệu nó có nhận ra phương thức được yêu cầu và gọi nó hay không.

Tiện ích mở rộng giao thức Swift sử dụng công văn tĩnh theo mặc định. Theo một nghĩa nào đó, khi UISearchBarDelegate chuyển một thông báo đến một lớp tuân thủ giao thức này, nó không thể tìm thấy phương thức mở rộng vì đây là phương thức tĩnh đối với giao thức. Do đó, việc triển khai của bạn sẽ không bị phát hiện bởi thời gian chạy cũng như chức năng.

Đây là một chủ đề sâu sắc. Tôi không muốn bạn phải rõ ràng với những đoạn văn đơn giản của tôi. Tuy nhiên, tôi đã thử điều này một cách vô ích khi các tiện ích mở rộng giao thức Swift còn mới (cố gắng khái quát hóa UITableViewDelegate và DataSource). Tôi đã phải nghiên cứu lý do và tôi có thể cho bạn biết từ kinh nghiệm và nghiên cứu của mình, nó liên quan đến nhắn tin Objc, dựa vào các tiện ích mở rộng giao thức để gửi động và gửi tĩnh.

Về ios - triển khai giao thức @objc khác trong Swift, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/47109329/

32 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress