我们可以为返回可选值的swift函数添加@objc吗?

时间:2015-06-12 07:36:36

标签: ios objective-c swift

我有一个快速的方法,如:

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

我想将它暴露给Objective-C运行时,所以我在它之前添加@objc。

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

我不确定为什么不允许使用可选值,因为Apple没有 在https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

中提及

只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容。这不包括仅限Swift的功能,例如此处列出的功能:

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

2 个答案:

答案 0 :(得分:0)

Int是Swift中定义的结构,仅在Swift-only功能中列出

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

所以答案是否

你需要把它分成两个函数或其他一些workaroud

答案 1 :(得分:0)

Objective-C函数无法返回指向Int的指针。您需要创建一个包装函数,如:

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

然后在Objective-C中,您可以测试NSNotFound

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