简体   繁体   中英

Can we add @objc for swift function that returns optional value?

I have a swift method like:

public func xIndexAtPoint(point: CGPoint) -> Int?

I want to expose it to Objective-C runtime, so I add @objc before it.

Method cannot be marked @objc because its result type cannot be represented in Objective-C

I am not sure why optional value is not allowed, since Apple does not mention it in https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

You'll have access to anything within a class or protocol that's marked with the @objc attribute as long as it's compatible with Objective-C. This excludes Swift-only features such as those listed here:

Generics

Tuples

Enumerations defined in Swift

Structures defined in Swift

Top-level functions defined in Swift

Global variables defined in Swift

Typealiases defined in Swift

Swift-style variadics

Nested types

Curried functions

Int is a structure defined in Swift which listed in Swift-only features

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_Int_Structure/index.html#//apple_ref/swift/struct/s:Si

So the answer is No

you need to break it into two function or some other workaroud

An Objective-C function can't return a pointer to an Int. You will need to create a wrapper function like:

@objc(xIndexAtPoint:)
public func _xIndexAtPoint(point: CGPoint) -> Int {
    return xIndexAtPoint(point: point) ?? NSNotFound
}

Then in Objective-C, you can test for NSNotFound

NSInteger i = [foo xIndexAtPoint:CGPointMake(10, 10)];
if(i == NSNotFound) {
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM