Unable to access Swift 4 class from Objective-C: “Property not found on object of type”

后端 未结 6 622
南笙
南笙 2020-12-04 18:55

Using the latest Xcode 9 beta, I\'m seemingly completely unable to access properties on Swift classes. Even odder, I can access the class itself to instantiate it or whateve

6条回答
  •  难免孤独
    2020-12-04 19:28

    Swift 3.2/4.0 / XCode 9.1

    You you set swift3.2 in project settings ( //:configuration = Debug SWIFT_VERSION = 3.2 )

    you can use your code,(using the correct import file in objc, see below). If You set project to swift 4.0 ( //:configuration = Debug SWIFT_VERSION = 4.0 )

    You must prepend @objc for every property.

    So:

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

    works.

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

    does NOT works: compiler fails:

    /Users....ViewController.m:24:21: Property 's1' not found on object of type 'MyClass *'

    as s1 is not prepended with @objc.

    You must write:

    @objc class MyClass: NSObject{
    
        @objc var s1: String?
        @objc var s2 : String?
    }
    

    (As a side-note: in C/C++/ObJC file, put always system/general *h files before your "local" class headers.)

    Swift 4

    just add @objcMembers before class @objcMembers class MyClassObject: NSObject { var s1: String! var s2: String!

    } Swift evolutionenter link description here

提交回复
热议问题