客观c中的Swift全局函数和全局函数

Ali*_*Ali 22 global-variables objective-c swift

文件说:

在C和Objective-C源文件中定义的全局常量由Swift编译器自动导入为Swift全局常量.

但它并没有说明相反的事情.我需要定义一个全局swift常量,并且能够将它看作目标c方,就像全局c常量一样.就像在快速方面定义:

public let CARDS = ["card1", "card2"]
Run Code Online (Sandbox Code Playgroud)

并看到在目标c方面使用它

NSLog(@"Cards count: %d", [CARDS count])
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我已经导入了swift自动生成的标题,如:

#import "MyProject-Swift.h"
Run Code Online (Sandbox Code Playgroud)

在Xcode中,如果我command-click在它上面,它会把我带到swift代码中的正确位置,但是在编译时我得到:

'User of undeclared Identifier CARDS'
Run Code Online (Sandbox Code Playgroud)

在我的目标c方面.

rin*_*aro 37

这是关于它的文件

只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容.这不包括仅限Swift的功能,例如此处列出的功能:

  • 泛型
  • 元组
  • Swift中定义的枚举
  • Swift中定义的结构
  • Swift中定义的顶级函数
  • Swift中定义的全局变量
  • 在Swift中定义的Typealiases
  • 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];
Run Code Online (Sandbox Code Playgroud)

  • 哇苹果……互操作性就这么多了。更像是必须用 swift 编写 hacky 类来实现 swift 自然可以做的每一件好事。苹果请修复这个问题 (3认同)
  • `只有从 NSObject 继承的类可以声明为 @objc`,所以你的类需要 `:NSObject`,并将 `override` 添加到 init() (2认同)

gre*_*nge 8

@rintaro 的回答很好,但是另一个简单的 Swift 答案可以在 Swift 和 Objective-C 中使用:

@objcMembers
class MyConstants: NSObject {
    static let kMyConstant1 = "ConstantValue1";
    static let kMyConstant2 = "ConstantValue2";
    static let CARDS = ["card1", "card2"]
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式在 Swift 和 Objective-C 上访问它:

MyConstants.kMyConstant1 // this will return "ConstantValue1"
MyConstants.CARDS // this will return array ["card1", "card2"]
Run Code Online (Sandbox Code Playgroud)