Saya ingin protokol ini:
protocol AddsMoreCommands {
/* ... */
}
hanya untuk diadopsi oleh kelas yang mewarisi dari kelas tersebut UIViewController
. Halaman ini memberi tahu saya bahwa saya dapat menentukan bahwa itu hanya diadopsi oleh kelas (sebagai lawan dari struct) dengan menulis
protocol AddsMoreCommands: class {
}
tetapi saya tidak dapat melihat bagaimana mensyaratkan bahwa itu hanya diadopsi oleh kelas tertentu. Halaman itu kemudian berbicara tentang menambahkan where
klausul ke ekstensi protokol untuk memeriksa kesesuaian tetapi saya juga tidak dapat melihat bagaimana menyesuaikannya.
extension AddsMoreCommands where /* what */ {
}
Apakah ada cara untuk melakukan ini? Terima kasih!
self
alih-alihSelf
:-( Terima kasih banyak, itu berfungsi dengan baik!AddsMoreCommands
tetapi metode yang Anda berikan untuk mengharapkanUIViewController
Ini juga dapat dicapai tanpa perpanjangan:
protocol AddsMoreCommands: class where Self: UIViewController { // code }
DIEDIT 2017/11/04 : Seperti yang ditunjukkan Zig , ini sepertinya menghasilkan peringatan pada Xcode 9.1. Saat ini ada masalah yang dilaporkan pada proyek Swift (SR-6265) untuk menghapus peringatan, saya akan mengawasinya dan memperbarui jawabannya sesuai.
EDITED 2018/09/29 :
class
diperlukan jika variabel yang akan menyimpan instans harus lemah (seperti delegasi). Jika Anda tidak memerlukan variabel lemah, Anda dapat menghilangkanclass
dan cukup tulis berikut ini dan tidak akan ada peringatan:protocol AddsMoreCommands where Self: UIViewController { // code }
sumber
AnyObject
sebagai pengganticlass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
Karena masalah dalam jawaban sebelumnya, saya berakhir dengan pernyataan ini:
protocol AddsMoreCommands where Self : UIViewController { // protocol stuff here }
tidak ada peringatan di Xcode 9.1
sumber
AddsMoreCommands
keUIViewController
mana saya ingin menghindari ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Sekarang di Swift 5 Anda dapat mencapai ini dengan:
protocol AddsMoreCommands: UIViewController { /* ... */ }
Cukup berguna.
sumber