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的功能,例如此处列出的功能:
- 泛型
- 元组
- Swift中定义的枚举
- Swift中定义的结构
- Swift中定义的顶级函数
- Swift中定义的全局变量
- 在Swift中定义的Typealiases
- Swift风格的可变参数
- 嵌套类型
- 咖喱功能
因此,不可能访问Swift中定义的全局变量(常量)或全局函数.
可能的解决方案:
从Apple Document Swift编程语言中,您可以将类型属性声明为
class var constant: Int = {
return 10
}()
Run Code Online (Sandbox Code Playgroud)
但目前在Swift(beta-3)Type属性中不受支持.
您可以声明一个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的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"
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中所示.
| 归档时间: |
|
| 查看次数: |
25145 次 |
| 最近记录: |