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

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


The rules for exposing Swift code to Objective-C have changed in Swift 4. Try this instead:

@objc var foobar = true

As an optimization, @objc inference have been reduced in Swift 4. For instance, a property within an NSObject-derived class, such as your TestViewController, will no longer infer @objc by default (as it did in Swift 3).

Alternatively, you could also expose all members to Objective-C at once using @objcMembers:

@objcMembers class TestViewController: UIViewController {    ...}

This new design is fully detailed in the corresponding Swift Evolution proposal.


Swift 3.2/4.0 / XCode 9.1

You you set swift3.2 in project settings ( //:configuration = DebugSWIFT_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 = DebugSWIFT_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.mimport "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


As for Swift 5.1 I found that "@objc" is not enough, but also make it public "@objc public":

@objc public class SomeClass: NSObject {    @objc public let amount: NSNumber...