当我在类的扩展中声明static参数时,我必须在变量之前写入@nonobjc,如下所示:
static
@nonobjc
@nonobjc static let test = "test"
有时候我必须在方法之前写@objc,那么@objc和@nonobjc在Swift中有什么用呢?有人能帮我解决这个问题吗?
@objc
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。
kb5ga3dv2#
从Swift Language Reference - Attributes [强调我的]:
一月一日
将此属性应用于可以在Objective-C中表示的任何声明-例如,非嵌套类、协议、非泛型枚举(限制为整数原始值类型)、属性和方法(包括getter和setter)、初始化程序、解除初始化程序和下标。objc属性告诉编译器在Objective-C代码中可以使用声明。...
objc
nonobjc
将此属性套用至方法、属性、注标或初始设定式宣告**,以隐藏隐含的objc属性**。nonobjc属性会告知编译器**,让宣告无法在Objective-C程式码中使用**,即使可以在Objective-C中表示。...
xlpyo6sf3#
您可以在此Swift Documentation : InteractingWithObjective-C中找到更多详细信息作为对您问题的回答,所附链接的概述如下。
@objc:当接口向Objective-C代码公开时,可以使用attribute来更改接口中的类、属性、方法、枚举类型或枚举case声明的名称。示例:如果Swift类的名称包含Objective-C不支持的字符,您可以提供一个在Objective-C中使用的替代名称。@无对象:它使得Swift声明在Objective-C中不可用。您可以使用它来解决桥接方法的循环性,并允许重载Objective-C导入的类的方法。
3条答案
按热度按时间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。
kb5ga3dv2#
从Swift Language Reference - Attributes [强调我的]:
一月一日
将此属性应用于可以在Objective-C中表示的任何声明-例如,非嵌套类、协议、非泛型枚举(限制为整数原始值类型)、属性和方法(包括getter和setter)、初始化程序、解除初始化程序和下标。
objc
属性告诉编译器在Objective-C代码中可以使用声明。...
nonobjc
将此属性套用至方法、属性、注标或初始设定式宣告**,以隐藏隐含的
objc
属性**。nonobjc
属性会告知编译器**,让宣告无法在Objective-C程式码中使用**,即使可以在Objective-C中表示。...
xlpyo6sf3#
您可以在此Swift Documentation : InteractingWithObjective-C中找到更多详细信息
作为对您问题的回答,所附链接的概述如下。
@objc:当接口向Objective-C代码公开时,可以使用attribute来更改接口中的类、属性、方法、枚举类型或枚举case声明的名称。
示例:如果Swift类的名称包含Objective-C不支持的字符,您可以提供一个在Objective-C中使用的替代名称。
@无对象:它使得Swift声明在Objective-C中不可用。您可以使用它来解决桥接方法的循环性,并允许重载Objective-C导入的类的方法。