swift init not visible in objective-C

The issue you’re seeing is that Swift can’t bridge optional value types — Int is a value type, so Int! can’t be bridged. Optional reference types (i.e., any class) bridge correctly, since they can always be nil in Objective-C. Your two options are to make the parameter non-optional, in which case it would be bridged to ObjC as an int or NSInteger:

// Swift
public init(userId: Int) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId
}

// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: 10];

Or use an optional NSNumber?, since that can be bridged as an optional value:

// Swift
public init(userId: NSNumber?) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId?.integerValue
}

// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: @10];    // note the @-literal

Note, however, you’re not actually treating the parameter like an optional – unless self.userId is also an optional you’re setting yourself up for potential runtime crashes this way.

Leave a Comment