使用最新的Xcode 9測試版,我似乎完全無法訪問Swift類的屬性。更奇怪的是,我可以訪問類本身來實例化它,但是完全無法訪問它的屬性。無法從Objective-C訪問Swift類:「在類型對象上找不到屬性」
所以,如果我有這樣的雨燕類:
import UIKit
class TestViewController: UIViewController {
var foobar = true
}
我嘗試這樣做:
我究竟在做什麼錯?和Xcode 9.
使用最新的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 –
**只有字符串屬性可訪問** –
#進口 「項目名 - 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