Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c中的Swift全局和全局函数_Objective C_Swift_Global Variables - Fatal编程技术网

Objective c 目标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编译器会自动将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 = [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语言仍然非常复杂、不直观,而且文档记录也很薄弱。在我们的项目中,解决持续的互操作问题花费了我们数周的开发日历时间——但我们仍然领先于硬件。哈哈