2017-08-13 18 views
8

Sử dụng phiên bản Xcode 9 beta mới nhất, dường như hoàn toàn không thể truy cập các thuộc tính trên các lớp Swift. Ngay cả odder, tôi có thể truy cập vào các lớp học chính nó để nhanh chóng nó hoặc bất cứ điều gì, nhưng hoàn toàn không thể truy cập tài sản trên đó.Không thể truy cập lớp Swift từ Mục tiêu-C: "Không tìm thấy thuộc tính trên đối tượng thuộc loại"

Vì vậy, nếu tôi có lớp Swift này:

import UIKit 

class TestViewController: UIViewController { 
    var foobar = true 
} 

Và tôi cố gắng để làm điều này:

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

chính xác tôi làm gì sai? dự án mới với Xcode 9.

+0

So sánh [Làm thế nào tôi có thể đối phó với phản đối suy luận @objc với #selector() trong Swift 4?] (Https://stackoverflow.com/q/44390378/2976878) – Hamish

Trả lời

25

Các quy tắc để lộ đang Swift để Objective-C đã thay đổi trong Swift 4. Hãy thử điều này thay vì:

@objc var foobar = true 

Là một tối ưu hóa, @objc suy luận đã giảm trong Swift 4. Ví dụ: thuộc tính trong một lớp học có kích thước NSObject, chẳng hạn như TestViewController của bạn, sẽ mặc định không còn là suy luận @objc theo mặc định.

Thiết kế mới được chi tiết đầy đủ trong the corresponding Swift Evolution proposal.

+0

Tôi vẫn đang gặp vấn đề truy cập các thuộc tính Int & Bool từ Swift tới mục tiêu-C ... và nhận được lỗi này: ** Thuộc tính không thể được đánh dấu @objc vì loại của nó không thể được biểu diễn trong Objective-C **, Bất kỳ suggetion nào? .. Tôi đã sử dụng tiêu đề "MyProject-Swift.h –

+0

** Chỉ có thuộc tính chuỗi có thể truy cập ** –

0
  1. Khi bạn thêm một tập tin nhanh chóng trong dự án Objective-C, Xcode sẽ nhắc thêm Objective-C bắc cầu tiêu đề tập tin, do đó cho phép các tập tin tiêu đề được tạo ra.
  2. Trong tệp triển khai mục tiêu-C của bạn nơi bạn muốn truy cập thuộc tính TestViewController foobar. Sử dụng cú pháp nhập sau đây và thay thế ProjectName bằng dự án của bạn.

#import "ProjectName-Swift.h"

Objective-C tập tin thực hiện:

#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 

Để biết thêm chi tiết đi qua Apple Documents

4

Swift 3.2/4.0/XCode 9.1

Bạn bạn thiết swift3.2 trong cài đặt dự án (//: Cấu hình = gỡ lỗi SWIFT_VERSION = 3,2)

bạn có thể sử dụng mã của bạn, (sử dụng các tập tin nhập khẩu đúng trong objc, xem dưới đây). Nếu Bạn đặt dự án để nhanh chóng 4,0 (//: Cấu hình = gỡ lỗi SWIFT_VERSION = 4,0)

Bạn phải thêm vào trước @objc cho mỗi tài sản.

Vì vậy:

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; 
} 

hoạt động.

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; 
} 

không hoạt động: trình biên dịch thất bại:

/Users....ViewController.m:24:21: Sở hữu 's1' không tìm thấy trên đối tượng của nhập 'MyClass *'

vì s1 không được thêm vào trước với @objc.

Bạn phải viết:

@objc class MyClass: NSObject{ 

    @objc var s1: String? 
    @objc var s2 : String? 
} 

(Là một phụ lưu ý: trong C/C++/file ObjC, đặt luôn hệ thống/tập tin * h chung trước khi tiêu đề lớp "địa phương" của bạn.)

Các vấn đề liên quan