如何在swift中声明一个可以在目标c中使用的常量

use*_*913 52 objective-c swift

如果我将swift常量声明为全局常量,如:

let a = "123"
Run Code Online (Sandbox Code Playgroud)

但是a目标c中找不到.

怎么解决这个?

Yat*_*B L 40

来自Apple Doc:

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

  1. 泛型
  2. 元组
  3. Swift中定义的枚举
  4. Swift中定义的结构
  5. Swift中定义的顶级函数
  6. Swift中定义的全局变量
  7. 在Swift中定义的Typealiases
  8. Swift风格的可变参数
  9. 嵌套类型
  10. 咖喱功能

因此,不可能访问Swift中定义的全局变量(常量)或全局函数.

可能的解决方案:

  1. 从Apple Document Swift编程语言中,您可以将类型属性声明为

    class var constant: Int =  {
        return 10
    }()
    
    Run Code Online (Sandbox Code Playgroud)

    但目前在Swift(beta-3)Type属性中不受支持.

  2. 您可以声明一个Class函数来获取一个常量值:

    在Swift中:

    class func myConst() -> String {
    
        return "Your constant"
    }
    
    Run Code Online (Sandbox Code Playgroud)

从Objective-C访问:

 NSString *constantValue = [ClassName myConst];
 NSLog(@"%@", constantValue);
Run Code Online (Sandbox Code Playgroud)


Gee*_*e.E 29

(迅速)

public class MyClass: NSObject {
    public static let myConst = "aConst"
}
Run Code Online (Sandbox Code Playgroud)

(然后在ObjC)

[MyClass myConst]
Run Code Online (Sandbox Code Playgroud)

这不是很好吗?因为这对我有用.
也这是有些作为第一创建对象(较短alloc,init).为每个常量创建一个新函数是......不漂亮:/

Swift 4的更新

由于Swift 4的Objective-C推断的变化,您还需要将@objc注释添加到声明的常量中.之前的声明变为:

@objcMembers
public class MyClass: NSObject {
    public static let myConst = "aConst"
}
Run Code Online (Sandbox Code Playgroud)

ObjC代码保持不变.

使用@objcMembers使所有常量可用(就好像你@objc在每个常量之前写的那样),但是我曾经有过编译器不知道会生成相应的ObjC代码的时间.

在那些情况下,我建议@objc在常量之前添加装饰器.
即:@objc public static let myConst = "aConst"


Jos*_*uez 7

let在Objective-C中使用时不应该有任何问题,下一个例子是用Xcode 7.2制作的:

MyClass.swift

import Foundation
import UIKit
@objc class MyClass : NSObject { // <== @objc AND NSObject ARE BOTH NECESSARY!!!
let my_color = UIColor( red:128/255,green:32/255,blue:64/255,alpha:1 ) // <== CONSTANT!!!
}
Run Code Online (Sandbox Code Playgroud)

MyObjectiveC.m

#import "PROJECTNAME-Swift.h" // <== NECESSARY TO RECOGNIZE SWIFT CLASSES!!!
@interface MyObjectiveC ()
@end
@implementation MyObjectiveC
@synthesize tableview; // <== ANY UI OBJECT, JUST AS EXAMPLE!!!
- (void) viewDidLoad () {
MyClass * mc = [ [ MyClass alloc ] init ]; // <== INSTANTIATE SWIFT CLASS!!!
tableview.backgroundColor = mc.my_color;   // <== USE THE CONSTANT!!!
}
@end
Run Code Online (Sandbox Code Playgroud)

PROJECTNAME 是Xcode项目的名称,如Project Navigator中所示.