Ios 如何仅向objc公开swift函数
我在Objective C应用程序中使用了一个swift框架。我有一个Ios 如何仅向objc公开swift函数,ios,objective-c,xcode,swift,Ios,Objective C,Xcode,Swift,我在Objective C应用程序中使用了一个swift框架。我有一个Location类,它有两个参数: ///Latitude in Decimal Degrees public var lat : Double? ///Longitude in Decimal Degrees public var lon : Double? 目标C无法访问,因为它们是可选的。我希望保持一个只有swift的类在这里工作,所以我的“解决办法”是为该类添加一些@objc方法,但我不希望它们能够被swift访问
Location
类,它有两个参数:
///Latitude in Decimal Degrees
public var lat : Double?
///Longitude in Decimal Degrees
public var lon : Double?
目标C无法访问,因为它们是可选的。我希望保持一个只有swift的类在这里工作,所以我的“解决办法”是为该类添加一些@objc
方法,但我不希望它们能够被swift访问
///Objective C Extensions to allow easier Access
extension LocationMessage {
@objc var getLat : Double {
if (lat != nil) {
return lat!
}
return -91;
}
@objc var getLon : Double {
if (lon != nil) {
return lon!;
}
return -181;
}
}
问题是:
1) 我可以把这个扩展放到框架中,但是有没有什么方法可以“隐藏”swift而不调用它呢
2) 我想我可以在我的Objective C应用程序中编写一个swift文件,将扩展名添加到类中,这是正确的方法吗
3) 还有其他方法吗?从Swift 3.1开始,这可以使用
@available
属性。其中提到了很多不同的选项,但没有明确说明如何将它们结合起来。但是,在3.1中实现的,讨论了将某些内容标记为Swift特定版本的过时内容:
@available(swift, obsoleted: 3.1)
class Foo {
//...
}
在本例中,尝试在Swift 3.1或更高版本中使用类Foo
,将出现错误。只要稍作调整,我们就可以做到这一点:
@available(swift, obsoleted: 1.0)
@objc(exampleMethodWithObject:)
static func exampleMethod(with object: NSObject) {
//...
}
在本例中,尝试在Swift 1.0或更高版本中使用方法exampleMethodWithObject:
,将产生错误,而在Objective-C中使用该方法则不会产生错误。(如果您确实想确定,可以指定已过时:0.1
。使用0.0
或不使用版本号不起作用。)
因此,对于您的代码,这应该是可行的:
extension LocationMessage {
@available(swift, obsoleted: 1.0)
@objc var getLat : Double {
if (lat != nil) {
return lat!
}
return -91
}
@available(swift, obsoleted: 1.0)
@objc var getLon : Double {
if (lon != nil) {
return lon!
}
return -181
}
}
@available(*,unavailable)
使代码对外部swift world不可用,但@objc
指令使目标c可以访问代码
@available (*, unavailable)
@objc public extension LocationMessage {
var getLat : Double {
if (lat != nil) {
return lat!
}
return -91;
}
var getLon : Double {
if (lon != nil) {
return lon!;
}
return -181;
}
}
我要说的是,第二条路要走。您是否尝试将扩展设置为私有?自swift 4起,“swift”平台仅可用于此属性。因此,您应该使用*来代替(“obsoleted”参数仅适用于swift版本,这样它才能工作)这在Xcode 12.2中似乎不起作用。生成的Objective-C标头包含SWIFT_UNAVAILABLE属性,并且该方法在两种语言中都不可用。@DavidSnabel Caunt该方法在xcode 12.2中仍然适用于我。