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 , @objcbir privatesı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, somethingHappenedyö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 @objcsırayla DistributedNotificationonun 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, @objcbunu bir KVC bağımlılığı oluşturarak kolayca yapabiliriz - aksi takdirde, özel mülk willSetve didSetişleyicilerdeki bildirimleri manuel olarak göndermek için kod yazmamız gerekir . Ek olarak, dependentPropertybağımlı olan KVC sistemini bilgilendiren statik özelliğin originalPropertyObjective-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.