gpt4 book ai didi

ios - 如何仅将 swift 函数公开给 objc

转载 作者:IT王子 更新时间:2023-10-29 05:50:01 25 4
gpt4 key购买 nike

我有一个在 Objective C 应用程序中使用的 swift 框架。我有一个具有两个参数的 Location 类:

///Latitude in Decimal Degrees
public var lat : Double?

///Longitude in Decimal Degrees
public var lon : Double?

Objective C 无法访问它们,因为它们是可选的。我希望在这里保留一个 swift-only 类,所以我的“解决方法”是为该类添加一些 @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) 还有其他方法吗?

最佳答案

从 Swift 3.1 开始,可以使用 @available 属性。 official documentation on attributes提到了很多不同的选项,但没有说清楚如何组合所有这些选项。然而this Swift evolution proposal ,在 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 中使用则不会。 (如果你真的想确定,你可以指定 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
}

}

关于ios - 如何仅将 swift 函数公开给 objc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32384715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com