我有一个swift框架,我在Objective C应用程序中使用它。我有一个Location
类有两个参数:
///Latitude in Decimal Degrees
public var lat : Double?
///Longitude in Decimal Degrees
public var lon : Double?
目标C无法访问,因为它们是可选项。我希望保持一个快速的班级在这里工作,所以我的“解决方法”是为班级添加一些@objc
方法 - 但我不希望它们可以快速访问。
///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)还有另一种方式吗?
答案 0 :(得分:9)
从Swift 3.1开始,可以使用@available
属性。 official documentation on attributes提到了很多不同的选项,但是并没有说明如何将所有这些选项结合起来。但是,在3.1中实现的this Swift evolution proposal讨论了某些版本的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中使用它则不会。 (如果您确实需要确定,可以指定obsoleted: 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
}
}
答案 1 :(得分:2)
@available (*, unavailable)
使代码无法用于向外迅速的世界,但是@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;
}
}