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