swift2 当@objc和@nonobjc写在swift中的方法和变量之前时?

kg7wmglp  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(142)

当我在类的扩展中声明static参数时,我必须在变量之前写入@nonobjc,如下所示:

@nonobjc static let test = "test"

有时候我必须在方法之前写@objc,那么@objc@nonobjc在Swift中有什么用呢?
有人能帮我解决这个问题吗?

4szc88ey

4szc88ey1#

这在Apple's official documentation中关于Objective-C - Swift互操作性进行了解释:
当您使用@objc(name)属性,这个类在Objective-C中是可用的,没有任何命名空间。因此,这个属性在将一个可存档的Objective-C类迁移到Swift时也是有用的。因为存档的对象在存档中存储了它们的类的名称,您应该使用@objc(name)属性来指定与Objective-C类相同的名称,这样旧的存档就可以被新的Swift类解存档。
相反,Swift也提供了@nonobjc属性,这使得Swift声明在Objective-C中不可用。您可以使用它来解决桥接方法的循环性,并允许Objective-C导入的类的方法重载。如果Objective-C方法被无法在Objective-C中表示的Swift方法覆盖,例如通过将参数指定为变量,该方法必须标记为@nonobjc。
总而言之,当你想向Objective-C公开一个Swift属性而不使用命名空间时,使用@objc。如果你想保持该属性只在Swift代码中可用和可访问,则使用@nonobjc。

kb5ga3dv

kb5ga3dv2#

  • (@bontoJR油井总结答复的附录/其他官方详细信息)*

Swift Language Reference - Attributes [强调我的]:

一月一日

将此属性应用于可以在Objective-C中表示的任何声明-例如,非嵌套类、协议、非泛型枚举(限制为整数原始值类型)、属性和方法(包括getter和setter)、初始化程序、解除初始化程序和下标。objc属性告诉编译器在Objective-C代码中可以使用声明
...

nonobjc

将此属性套用至方法、属性、注标或初始设定式宣告**,以隐藏隐含的objc属性**。nonobjc属性会告知编译器**,让宣告无法在Objective-C程式码中使用**,即使可以在Objective-C中表示。
...

xlpyo6sf

xlpyo6sf3#

您可以在此Swift Documentation : InteractingWithObjective-C中找到更多详细信息
作为对您问题的回答,所附链接的概述如下。

@objc:当接口向Objective-C代码公开时,可以使用attribute来更改接口中的类、属性、方法、枚举类型或枚举case声明的名称。
示例:如果Swift类的名称包含Objective-C不支持的字符,您可以提供一个在Objective-C中使用的替代名称。
@无对象:它使得Swift声明在Objective-C中不可用。您可以使用它来解决桥接方法的循环性,并允许重载Objective-C导入的类的方法。

相关问题