Başka bir geç cevap, ancak bu sorudaki mevcut cevaplardan hiçbiri OP'nin sorusuna gerçekten cevap vermiyor: Neden Objective-C ve söz konusu üye ile etkileşim için varsa , @objc
bir private
sınıf üyesi üzerinde kullanmak zorunda kalacaksınız. @objc
özeldir, yani projenizde Objective-C kodunuz olsa bile üyeyi yine de görememeli?
Bunun nedeni, çerçevelerin çoğu Objective-C'de yazıldığından, bazen belirli API'lerle etkileşim kurmak için Objective-C özelliklerine ihtiyaç duyulmasıdır.
Örneğin, şu yolla bir bildirim için kaydolmak istediğimi varsayalım DistributedNotificationCenter
:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
Bunun işe yaraması için, somethingHappened
yöntem için seçiciyi alabilmemiz gerekir . Bununla birlikte, seçiciler bir Objective-C konseptidir, bu nedenle yöntem, Objective-C tarafından görünür değilse, bir seçicisi yoktur. Bu nedenle, yöntem özeldir ve keyfi dışında koduyla adlandırılan olmamalıdır bile, bir gerekecektir @objc
sırayla DistributedNotification
onun seçicinin aracılığıyla diyoruz edebilmek için, Objective-C ile yazılmış kod.
@objc
İhtiyaç duyulan diğer bir yaygın durum , özellikle KVC ve KVO'nun Kakao Bağlamalarını uygulamak için kullanıldığı macOS'ta Anahtar Değer Kodlamasını (KVC) desteklemektir. KVC, Cocoa'daki diğer birçok sistemde olduğu gibi, Objective-C'de uygulanmaktadır ve bu, KVC uyumlu özelliklerin Objective-C çalışma zamanına maruz kalmasını gerektirme etkisine sahiptir. Bazen, KVC uyumlu mülklerin özel olması mantıklıdır. Bir örnek, diğer özellikleri etkileyen bir mülkünüzün olmasıdır:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
Bu durumda, bizim asıl depolanan özellik özel, ama biz bağımlı özellik, do dışında kod maruz, özel mülkiyet güncellendiğinde de bildirimlerini göndermesi gerekir. Özel mülkü olarak işaretleyerek, @objc
bunu bir KVC bağımlılığı oluşturarak kolayca yapabiliriz - aksi takdirde, özel mülk willSet
ve didSet
işleyicilerdeki bildirimleri manuel olarak göndermek için kod yazmamız gerekir . Ek olarak, dependentProperty
bağımlı olan KVC sistemini bilgilendiren statik özelliğin originalProperty
Objective-C'ye maruz kalması gerekir, böylece KVC sistemi onu bulur ve çağırır, ancak kodumuzun istemcileri ile ilgili değildir.
Ayrıca, bir uygulama ayrıntısı olarak Cocoa Bindings kullanarak görünümünde kontrolleri güncelleyen bir macOS uygulamasındaki bir görünüm denetleyicisi, bu kontrolleri bunlara bağlamak için belirli özel özellikleri KVC uyumlu hale getirebilir.
Gördüğünüz gibi, kodunuzun istemcileri tarafından görünmesi gerekmeksizin çerçevelerle etkileşime geçmek için bir yöntemin veya özelliğin Objective-C'ye maruz bırakılması gereken zamanlar vardır.