ios - 無法從Objective-C訪問Swift 4類:“在類型對像上找不到屬性”




xcode swift4 (4)

使用最新的Xcode 9 beta,我似乎完全無法訪問Swift類的屬性。 甚至更奇怪,我可以訪問類本身來實例化它或其他什麼,但完全無法訪問它上面的屬性。

所以,如果我有這個Swift類:

import UIKit

class TestViewController: UIViewController {
    var foobar = true
}

我試著這樣做:

TestViewController *testViewController = [[TestViewController alloc] init]; // success
testViewController.foobar; // error

我究竟做錯了什麼? Xcode 9的新項目。


  1. 當您在Objective-C項目中添加swift文件時,Xcode將提示添加 Objective-C橋接頭 文件,因此允許創建頭文件。
  2. 在Objective-C實現文件中,您要訪問TestViewController屬性 foob​​ar 。 使用以下導入語法並將ProjectName替換為您的項目。

#import“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文檔


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文件中,將“system / general * h”文件放在“本地”類頭之前。)

斯威夫特4

只需在類 @objcMembers 類之前添加@objcMembers類MyClassObject:NSObject {var s1:String! var s2:String!

Swift evolution 在這裡輸入鏈接描述


我也遇到過swift 3.0中的這個問題

類聲明就是這樣

class ClassA {
//statements
}

在Objective C代碼中無法訪問上面的類,它也沒有在-Swift.h中註冊

一旦我從NSObject繼承了這樣的:

class ClassA : NSObject {
//statements
} 

該類可以在Objective c中訪問,並在-Swift.h中註冊

當您不想避免從NSobject類繼承時,此解決方案很有用。


Xcode 10.2 | Swift 4 @objcMembers 前添加 @objcMembers 解決了我的問題。

@objcMembers class MyClass:NSObject {
   var s1: String!
   var s2: NSMutableArray!
}






swift4