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

Posted

技术标签:

【中文标题】我们可以为返回可选值的 swift 函数添加 @objc 吗?【英文标题】:Can we add @objc for swift function that returns optional value? 【发布时间】:2015-06-12 07:36:36 【问题描述】:

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

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

【问题讨论】:

您是否尝试过使用可选的 NSNumber。要么有,要么有一个非可选的 int,如果有错误等,则返回 -1。 我需要它在 Objective-C 运行时返回 NSInteger。 但是 NSInteger 不是一个类值,所以它不能为 nil,因为它是可选的。 返回类类型还是结构类型都没有关系,swift中任意类型都可以使用可选 可选类型可以与 Objective-C 一起使用,(nullable) 关键字增加了对此的支持。它在目标 c 中自动展开,因此在 swift 中包含 null 的可选项在目标 c 中将只是 nil/null 【参考方案1】:

Int 是在 Swift 中定义的结构,它在 Swift-only features 中列出

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

所以答案是否定的

你需要把它分成两个功能或其他一些解决方法

【讨论】:

那么我应该使用哪个作为可选值? @Wingzero 显然可选值也只是 swift 。如果苹果以后打算用swift替换objc的话,就不用保证objc中的每一个swift函数都可以调用 好吧,我认为 objc 将与 C 一样长,并且无法替代:) 我觉得一个项目将在很长一段时间内混合 objc 和 swift,直到苹果只提供新的 API迅速。对于老 ios 开发者来说,objc 更舒服【参考方案2】:

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) 

【讨论】:

以上是关于我们可以为返回可选值的 swift 函数添加 @objc 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift初见Swift可选值Optionals

用返回非可选值的计算属性覆盖返回可选值的计算属性

《函数式swift》—swift为什么是用可选值?

Swift 中的可选值是啥?

Swift函数式编程四(可选值)

Swift函数式编程四(可选值)