Swift 3.2/4.0 / XCode 9.1
您在项目设置中设置了 swift3.2 ( //:configuration = Debug
SWIFT_VERSION = 3.2 )
您可以使用您的代码,(在 objc 中使用正确的导入文件,见下文)。
如果您将项目设置为 swift 4.0 ( //:configuration = Debug
SWIFT_VERSION = 4.0 )
您必须为每个属性添加 @objc。
所以:
Swift 3.2:
// MyClass.swift
@objc class MyClass: NSObject{
var s1: String?
@objc var s2 : String?
}
//
// ViewController.m
import "MixingObjCAndSwift-Swift.h"
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyClass * mc = [MyClass new];
NSString * s1 = mc.s1;
NSString * s2 = mc.s2;
}
有效。
Swift 4.0:
// MyClass.swift
@objc class MyClass: NSObject{
var s1: String?
@objc var s2 : String?
}
.....
- (void)viewDidLoad {
[super viewDidLoad];
MyClass * mc = [MyClass new];
NSString * s1 = mc.s1;
NSString * s2 = mc.s2;
}
不起作用:编译器失败:
/Users....ViewController.m:24:21:在“MyClass *”类型的对象上找不到属性“s1”
因为 s1 没有以 @objc 开头。
你必须写:
@objc class MyClass: NSObject{
@objc var s1: String?
@objc var s2 : String?
}
(附带说明:在 C/C++/ObJC 文件中,始终将系统/通用 *h 文件放在“本地”类头文件之前。)
斯威夫特 4
只需在课前添加@objcMembers
@objcMembers 类 MyClassObject: NSObject
{
var s1:字符串!
var s2: 字符串!
}
迅捷进化enter link description here