无法从Objective-C访问Swift类:“在类型对象上找不到属性”

问题描述:

使用最新的Xcode 9测试版,我似乎完全无法访问Swift类的属性。更奇怪的是,我可以访问类本身来实例化它,但是完全无法访问它的属性。无法从Objective-C访问Swift类:“在类型对象上找不到属性”

所以,如果我有这样的雨燕类:

import UIKit 

class TestViewController: UIViewController { 
    var foobar = true 
} 

我尝试这样做:

​​

我究竟在做什么错?和Xcode 9.

+0

比较[我如何处理@o​​bjc推断弃用#选择器()在Swift 4?](https://stackoverflow.com/q/44390378/2976878) – Hamish

的暴露斯威夫特代码的Objective-C的规则的新项目已在斯威夫特4.改变试试这个:

@objc var foobar = true 

作为一种优化,@objc推论已经在斯威夫特4减少。例如,NSObject派生类中的某个属性(例如您的TestViewController)将不再是默认推断@objc

新设计在the corresponding Swift Evolution proposal中有详细说明。

+0

我仍然面临问题从Swift访问Int&Bool属性到Objective-C ...并得到这个错误:**属性不能被标记@objc,因为它的类型不能用Objective-C **表示,任何含义? ..我已经使用标题“MyProject-Swift.h –

+0

**只有字符串属性可访问** –

  1. 当您添加在您的Objective-C的项目迅速的文件时,Xcode会提示添加Objective-C的桥接报文件,所以允许创建的头文件。
  2. 在您的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文件。)