Objective c 目标c中的Swift全局和全局函数
文件说: Swift编译器会自动将C和Objective-C源文件中定义的全局常量作为Swift全局常量导入Objective c 目标c中的Swift全局和全局函数,objective-c,swift,global-variables,Objective C,Swift,Global Variables,文件说: Swift编译器会自动将C和Objective-C源文件中定义的全局常量作为Swift全局常量导入 // Swift public let CARDS = ["card1", "card2"] @objc class AppConstant { private init() {} class func cards() -> [String] { return CARDS } } // Objective-C NSArray *cards = [AppConstan
// Swift
public let CARDS = ["card1", "card2"]
@objc class AppConstant {
private init() {}
class func cards() -> [String] { return CARDS }
}
// Objective-C
NSArray *cards = [AppConstant cards];
但它并没有说任何相反的事情。我需要定义一个全局swift常数,并且能够像全局c常数一样在目标c面看到它。与swift侧类似,定义:
public let CARDS = ["card1", "card2"]
在目标c面使用它,就像
NSLog(@"Cards count: %d", [CARDS count])
我该怎么办?我已经导入了swift自动生成的标题,如:
#import "MyProject-Swift.h"
在Xcode中,如果我单击命令,它会将我带到swift代码中的正确位置,但在编译时我会得到:
'User of undeclared Identifier CARDS'
在我的目标c方面。关于它
您可以访问类或协议中任何
标记为@objc属性,只要它与
目标C。这不包括仅Swift功能,如所列功能
在这里:
- 仿制药
- 元组
- Swift中定义的枚举
- Swift中定义的结构
- Swift中定义的顶级功能
- Swift中定义的全局变量
- Swift中定义的类型别名
- 快速式变量
- 嵌套类型
- 咖喱函数
全局变量(包括常数)不可从Objective-C获取
相反,您必须声明一个具有全局常量访问器的类
// Swift
public let CARDS = ["card1", "card2"]
@objc class AppConstant {
private init() {}
class func cards() -> [String] { return CARDS }
}
// Objective-C
NSArray *cards = [AppConstant cards];
@rintaro给出了一个很好的答案,但对于常数,另一个简单的Swift答案可以在Swift和Objective-C中使用:
@objcMembers
class MyConstants: NSObject {
static let kMyConstant1 = "ConstantValue1";
static let kMyConstant2 = "ConstantValue2";
static let CARDS = ["card1", "card2"]
}
您可以通过以下方式在Swift和Objective-C上访问:
MyConstants.kMyConstant1 // this will return "ConstantValue1"
MyConstants.CARDS // this will return array ["card1", "card2"]
objC无法访问Swift全局功能(即Swift顶级功能)。时期故事结束了
参见上文rintaro的回答,即……
“这不包括仅Swift的功能,如此处列出的功能:
. . .
Swift中定义的顶级功能”
Swift中定义的boom全局变量目前不能用于目标CWow apple。。。互操作性就到此为止。更像是为了斯威夫特自然能做的每一件好事,不得不用斯威夫特写一些黑客类。Apple please fix This另一个选项是在Objective-C中创建一个头文件,其中包含Objective-C和Swift之间共享的所有常量,并将其导入任何需要访问常量以及项目桥接头的Objective-C文件中。“这不包括此处列出的仅Swift的功能:”bit令人恼火。全局变量和全局/顶级函数不是swift唯一的功能。我可以在C或Objtovi-C中创建一个全局函数,它在Swift中是可见的,但是我不能做相反的操作。<代码>只有继承NSObjor的类可以声明为Objc< /Cord>。因此,您需要为类编写<代码>:NSbObjs/Cuff>,并将<代码> Objys/COD>添加到它()中。它是SWIFT、Objc、Objc++、C++的2020个互操作性。C语言仍然非常复杂、不直观,而且文档记录也很薄弱。在我们的项目中,解决持续的互操作问题花费了我们数周的开发日历时间——但我们仍然领先于硬件。哈哈