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

Doug Smith picture Doug Smith · Aug 13, 2017 · Viewed 29.8k times · Source

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 whatever, but completely unable to access properties on it.

So if I have this Swift class:

import UIKit

class TestViewController: UIViewController {
    var foobar = true
}

And I try to do this:

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

What exactly am I doing wrong? New project with Xcode 9.

Answer

Paulo Mattos picture Paulo Mattos · Aug 13, 2017

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.