如何仅向objc公开swift函数

时间:2015-09-03 20:18:32

标签: ios objective-c xcode swift

我有一个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)还有另一种方式吗?

2 个答案:

答案 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;
}
}