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

时间:2014-06-16 05:31:36

标签: objective-c swift

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

let a = "123"

目标c 中无法找到a

如何解决这个问题?

6 个答案:

答案 0 :(得分:40)

来自Apple Doc:

  

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

     
      
  1. 泛型
  2.   
  3. 元组
  4.   
  5. Swift中定义的枚举
  6.   
  7. Swift中定义的结构
  8.   
  9. Swift中定义的顶级函数
  10.   
  11. 在Swift中定义的全局变量
  12.   
  13. Swift中定义的Typealiases
  14.   
  15. Swift式variadics
  16.   
  17. 嵌套类型
  18.   
  19. 咖喱功能
  20.   

因此无法访问Swift中定义的全局变量(常量)或全局函数。

可能的解决方案:

  1. 从Apple文档Swift programming language,您可以将类型属性声明为

    class var constant: Int =  {
        return 10
    }()
    

    但目前不支持Swift(beta-3) 类型属性

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

    在Swift中:

    class func myConst() -> String {
    
        return "Your constant"
    }
    
  3. 从Objective-C访问:

     NSString *constantValue = [ClassName myConst];
     NSLog(@"%@", constaValue);
    

答案 1 :(得分:24)

(SWIFT)

public class MyClass: NSObject {
    public static let myConst = "aConst"
}

(然后在ObjC中)

[MyClass myConst]

这不是很有效吗?因为这对我有用。
此外,首先创建对象(allocinit),有点更短。为每个常量创建一个新函数是......不漂亮:/

Swift 4的更新

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

@objcMembers
public class MyClass: NSObject {
    public static let myConst = "aConst"
}

ObjC代码保持不变。

  

使用@objcMembers使所有常量可用(就好像你在每个常量之前写@objc一样),但我有时候编译器不会生成相应的ObjC代码。

     

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

答案 2 :(得分:7)

使用Objective-C中的let不会有任何问题,下一个示例是使用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!!!
}

<强> 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

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

答案 3 :(得分:1)

在你的快速课程中,

let constant: Float = -1
class YourClass: NSObject {
class func getMyConstant() -> Float {return constant}
...
}

清理,构建让xcode准备这个方法可用于obj-c。 然后在你的obj-c班

if ([YourClass getMyConstant] != 0) {
...
}

答案 4 :(得分:0)

首先,您需要了解自动生成的Swift头文件的重要性。

这将使 magic 转录Swift代码,以便从Objective-C中理解。

此文件由Xcode自动生成(不要在项目中查找)。

此文件的重要性是使用正确的名称,它可以与您的目标名称匹配,但可能不是,它是产品模块名称。 (在项目设置中将其搜索为“产品模块”

您需要在要使用Swift文件的Swift类以及Swift文件的Swift类名的Objective-C类上导入此文件

#import <ProductModuleName-Swift.h>
@class MySwiftClassName;

我的Swift类应该有前缀 @objc 继承自 NSObject

@objc class MySwiftClassName: NSObject {
   let mySwiftVar = "123"
}

然后你可以从Objective-C文件调用你的Swift变量:

MySwiftClassName *mySwiftClassO = [[MySwiftClassName alloc] init];
NSString *myVar = mySwiftClassO.mySwiftVar;

确保在每次更改后清理并重建项目,以强制重新生成此自动生成的文件。

如果您的Swift头文件是自动生成的,您可以通过单击导入文件名导航到它,并检查您所需的所有代码是否已正确转录。

在以下文章中,您可以找到有关此内容的更多详细信息。 https://solidgeargroup.com/bridging-swift-objective-c

答案 5 :(得分:0)

类func不起作用。我发现的唯一解决方案是:

class YourController: NSObject {

@objc static let shared = YourController()

private override init() { }

@objc class func sharedInstance() -> YourController {
    return YourController.shared
}

@objc let terms = "Your-String-here"

然后在Obj-c文件上:

[[YourController sharedInstance].terms]