Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何仅向objc公开swift函数_Ios_Objective C_Xcode_Swift - Fatal编程技术网

Ios 如何仅向objc公开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访问

我在Objective C应用程序中使用了一个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中仍然适用于我。