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 internal
veya daha yüksek Objective-C uyumlu NSObject
mirasçı sınıfların üyelerinin Objective-C'ye @objc
maruz 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ı @objc
yöntemlerinin uygulamaları @objc
ima özelliklerle protokol şartları ve bildirimleri @objc
gibi @IBOutlet
.
Bunun arkasındaki motivasyon , yukarıdaki bağlantılı öneride detaylandırıldığı gibi , ilk olarak, NSObject
sı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 @objc
olacak. 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 .
@objc
için artık gerekli olarak işaretlemek .