我们可以为返回可选值的 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章