如果我将swift常量声明为全局常量,如:
let a = "123"
但目标c 中无法找到a
。
如何解决这个问题?
答案 0 :(得分:40)
来自Apple Doc:
只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容。这不包括仅限Swift的功能,例如此处列出的功能:
- 泛型
- 元组
- Swift中定义的枚举
- Swift中定义的结构
- Swift中定义的顶级函数
- 在Swift中定义的全局变量
- Swift中定义的Typealiases
- Swift式variadics
- 嵌套类型
- 咖喱功能
醇>
因此无法访问Swift中定义的全局变量(常量)或全局函数。
可能的解决方案:
从Apple文档Swift programming language,您可以将类型属性声明为
class var constant: Int = {
return 10
}()
但目前不支持Swift(beta-3) 类型属性 。
您可以声明一个Class函数来获取一个常量值:
在Swift中:
class func myConst() -> String {
return "Your constant"
}
从Objective-C访问:
NSString *constantValue = [ClassName myConst];
NSLog(@"%@", constaValue);
答案 1 :(得分:24)
(SWIFT)
public class MyClass: NSObject {
public static let myConst = "aConst"
}
(然后在ObjC中)
[MyClass myConst]
这不是很有效吗?因为这对我有用。
此外,首先创建对象(alloc
,init
),有点更短。为每个常量创建一个新函数是......不漂亮:/
由于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]