无法从Objective-C访问Swift类:“在类型对象上找不到属性”
使用最新的Xcode 9测试版,我似乎完全无法访问Swift类的属性。更奇怪的是,我可以访问类本身来实例化它,但是完全无法访问它的属性。无法从Objective-C访问Swift类:“在类型对象上找不到属性”
所以,如果我有这样的雨燕类:
import UIKit
class TestViewController: UIViewController {
var foobar = true
}
我尝试这样做:
我究竟在做什么错?和Xcode 9.
的暴露斯威夫特代码的Objective-C的规则的新项目已在斯威夫特4.改变试试这个:
@objc var foobar = true
作为一种优化,@objc
推论已经在斯威夫特4减少。例如,NSObject
派生类中的某个属性(例如您的TestViewController
)将不再是默认推断@objc
。
新设计在the corresponding Swift Evolution proposal中有详细说明。
我仍然面临问题从Swift访问Int&Bool属性到Objective-C ...并得到这个错误:**属性不能被标记@objc,因为它的类型不能用Objective-C **表示,任何含义? ..我已经使用标题“MyProject-Swift.h –
**只有字符串属性可访问** –
- 当您添加在您的Objective-C的项目迅速的文件时,Xcode会提示添加Objective-C的桥接报文件,所以允许创建的头文件。
- 在您的Objective-C实现文件中,您要访问TestViewController属性foobar。使用以下导入语法并将ProjectName替换为您的项目。
#进口 “项目名 - Swift.h”
Objective-C的实现文件:
#import "ViewController.h"
#import "ProjectName-Swift.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
TestViewController *testViewController = [[TestViewController alloc] init]; // success
BOOL prop = testViewController.foobar;
NSLog(@"Property: %d", prop);
}
@end
欲了解更多详情,请通过Apple Documents
斯威夫特3.2/4.0/XCode 9.1
您设置在项目设置swift3.2(//:配置=调试 SWIFT_VERSION = 3.2)
你可以用你的代码,(使用objc正确导入文件,见下文)。 如果设置项目SWIFT 4.0(//:配置=调试 SWIFT_VERSION = 4.0)
你必须在前面加上@objc每一个属性。
所以:
斯威夫特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;
}
的作品。
雨燕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:房产 'S1' 上的对象未找到键入'MyClass *'
由于s1未被预置为@objc。
你必须写:
@objc class MyClass: NSObject{
@objc var s1: String?
@objc var s2 : String?
}
(作为一个侧面说明:在C/C++/ObJC文件,把一直是你的 “本地” 类的头前,系统/通用* .h文件。)
比较[我如何处理@objc推断弃用#选择器()在Swift 4?](https://stackoverflow.com/q/44390378/2976878) – Hamish