Düzeltme doğrudur - başvurduğu yöntemi Objective-C'ye maruz bırakmak için seçici hakkında değiştirebileceğiniz hiçbir şey yoktur.
İlk etapta bu uyarının tüm nedeni SE-0160'ın sonucudur . Swift 4'ten önce internalveya daha yüksek Objective-C uyumlu NSObjectmirasçı sınıfların üyelerinin Objective-C'ye @objcmaruz kaldığı ve dolayısıyla onlara maruz kaldıkları çıkarıldı , bu nedenle seçiciler kullanılarak çağrılmalarına izin verildi (çünkü yöntemi aramak için Obj-C çalışma zamanı gerekliydi) belirli bir seçici için uygulama).
Ancak Swift 4'te artık durum böyle değil. Sadece çok özel açıklamalar şimdi olmak çıkarılmaktadır @objcörneğin, bir geçersiz kılmaları @objcyöntemlerinin uygulamaları @objcima özelliklerle protokol şartları ve bildirimleri @objcgibi @IBOutlet.
Bunun arkasındaki motivasyon , yukarıdaki bağlantılı öneride detaylandırıldığı gibi , ilk olarak, NSObjectsınıfların miras alınmasındaki aşırı metot aşırı yüklerinin, özdeş seçicilere sahip oldukları için birbirleriyle çarpışmasını önlemektir . İkinci olarak, Obj-C'ye maruz kalması gerekmeyen üyeler için thunk oluşturmak zorunda kalmayarak ikili boyutu azaltmaya yardımcı olur ve üçüncü olarak dinamik bağlamanın hızını artırır.
Bir üyeyi Obj-C'ye maruz bırakmak istiyorsanız @objc, örneğin şu şekilde işaretlemeniz gerekir :
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(foo), for: .touchUpInside)
}
@objc func foo() {
// ...
}
}
("çıkarımı en aza indir" seçeneği seçiliyken, göçmen bunu seçicilerle sizin için otomatik olarak yapmalıdır)
Bir grup üyeyi Obj-C'ye maruz bırakmak için şunları kullanabilirsiniz @objc extension:
@objc extension ViewController {
// both exposed to Obj-C
func foo() {}
func bar() {}
}
Bu, içinde tanımlanan tüm üyeleri Obj-C'ye maruz bırakır ve Obj-C'ye maruz kalamayan herhangi bir üyede bir hata verir (açıkça işaretlenmedikçe @nonobjc).
İhtiyacınız bir sınıf varsa hepsi Obj-C uyumlu üyeleri Obj C maruz kalması, sınıfı olarak işaretleyebilirsiniz @objcMembers:
@objcMembers
class ViewController: UIViewController {
// ...
}
Şimdi, olduğu anlaşılabilecek tüm üyeler @objcolacak. Ancak, üyelerin gereksiz yere açığa çıkmasının yukarıda belirtilen dezavantajları göz önüne alındığında, Obj-C'ye maruz kalan tüm üyelere gerçekten ihtiyaç duymadığınız sürece bunu yapmanızı tavsiye etmem .
@objciçin artık gerekli olarak işaretlemek .