当@objc和@nonobjc在swift中写在方法和变量之前?
Posted
技术标签:
【中文标题】当@objc和@nonobjc在swift中写在方法和变量之前?【英文标题】:When @objc and @nonobjc write before method and variable in swift? 【发布时间】:2016-12-08 09:34:16 【问题描述】:当我在类的扩展中声明static
参数时,我必须在变量之前写@nonobjc
:
@nonobjc static let test = "test"
有时我必须在方法之前写@objc
,那么@objc
和@nonobjc
在Swift 中有什么用。
谁能帮我解决这个问题?
【问题讨论】:
Swift Language Reference - Attributes 【参考方案1】:这在 Apple's official documentation 关于 Objective-C - Swift 互操作性中有解释:
当您在 Swift 类上使用 @objc(name) 属性时,该类是 在没有任何命名空间的情况下在 Objective-C 中可用。因此, 此属性在迁移归档文件时也很有用 Swift 的 Objective-C 类。因为归档对象存储的名称 他们在存档中的类,您应该使用 @objc(name) 属性 指定与您的 Objective-C 类相同的名称,以便旧的 新的 Swift 类可以取消归档档案。
相反,Swift 也提供了@nonobjc 属性,它使 Swift 声明在 Objective-C 中不可用。你可以用它来 解决桥接方法的循环性并允许重载 Objective-C 导入的类的方法。如果一个 Objective-C 方法 被无法表示的 Swift 方法覆盖 Objective-C,例如通过将参数指定为变量,即 方法必须标记为@nonobjc。
总而言之,当您想在没有命名空间的情况下将 Swift 属性公开给 Objective-C 时,请使用 @objc。如果您想保持该属性仅在 Swift 代码中可用和可访问,请使用 @nonobjc。
【讨论】:
当声明一个我们不想暴露给 Objective-C 的扩展时,现在这不是仅限于“覆盖”类的@objcMembers
注释吗?【参考方案2】:
(附录/@bontoJR 的补充官方详细信息很好地总结了答案)
来自Swift Language Reference - Attributes [强调我的]:
objc
将此属性应用于任何可以表示的声明 Objective-C——例如,非嵌套类、协议、非泛型 枚举(仅限于整数原始值类型)、属性和 类和协议的方法(包括 getter 和 setter), 初始化器、反初始化器和下标。
objc
属性告诉 声明可在 Objective-C 中使用的编译器 代码。...
nonobjc
将此属性应用于方法、属性、下标或初始化程序 声明以抑制隐式
objc
属性。nonobjc
属性告诉编译器 使声明在 Objective-C 代码,即使它可以用 Objective-C。...
【讨论】:
【参考方案3】:您可以在此Swift Documentation : InteractingWithObjective-C 中找到更多详细信息
作为对您问题的回答,所附链接的概述如下。
@objc :你可以使用属性来改变一个类、属性、方法、枚举类型或枚举案例声明的名称 你的接口暴露给 Objective-C 代码。
示例:如果您的 Swift 类的名称包含 Objective-C 不支持的字符,您可以提供一个替代名称以在 Objective-C 中使用。
@nonobjc :它使 swift 声明在 Objective-C 中不可用。您可以使用它来解决桥接的循环性 方法并允许重载由 导入的类的方法 Objective-C。
【讨论】:
以上是关于当@objc和@nonobjc在swift中写在方法和变量之前?的主要内容,如果未能解决你的问题,请参考以下文章
从 JSON + Swift 或 ObjC 检索数据时如何处理 CoreData 中的关系
swift 1.2 版中的 iCarousel 错误(候选不是 Objc 但协议需要它)
iOS swift objc_setAssociatedObject和objc_getAssociatedObject使用