2017-08-13 87 views
8

使用最新的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

回答

25

的暴露斯威夫特代碼的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

**只有字符串屬性可訪問** –

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

4

斯威夫特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文件。)