例如我在swift中有这个方法:
@objc class MyClass: NSObject
....
@objc class func viewWithIndex(index: Int, str: String) {
println(index, str)
}
然后我想在我的objective-c类中调用该方法,我希望像这个调用一样简单[MyClass viewWithIndex:10 str:@"string"];
但它不起作用。
我怎么称呼它?请帮忙。
注意:我已经对objective-c [MyClass showSomething];
进行了快速函数调用,这意味着我已经成功设置了桥接类的必要设置。只有具有两个或更多参数的函数才是我的问题。 :)
解决了:
我不知道我发生了什么,但我刚刚重新启动了我的Mac并删除了objc
,并且它与调用[MyClass viewWithIndex:10 str:@"string"];
一起工作。我记得在文档中阅读。
Migrating Your Objective-C Code to Swift
答案 0 :(得分:12)
这在Swift 3.0中对我有用
[MyClass viewWithIndex:10 str:@"string"]
在Swift声明中的第一个参数之前添加下划线允许我从目标c调用而不命名第一个参数,如下所示:
private void startLocationUpdates() {
final LocationRequest locationRequest = LocationRequest.create().setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY).setInterval(LOCATION_UPDATE_INTERVAL)
.setFastestInterval(LOCATION_UPDATE_FASTEST_INTERVAL).setSmallestDisplacement(LOCATION_UPDATE_SMALLEST_DISPLACEMENT_METERS);
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, locationListener);
}
答案 1 :(得分:3)
我相信您需要将该功能标记为公开(有意义)或动态。否则它将成为Swift优化的候选者(内联或vtable方法),这将使Objective-C不可见。
试试这个:
public class func viewWithIndex(index: Int, str: String) {
println(index, str)
}
或者这个:(不是真的有道理,但也应该有效)
private dynamic class func viewWithIndex(index: Int, str: String) {
println(index, str)
}
答案 2 :(得分:0)
在Objective-c的.h文件中对您的类进行前向声明
@class <MySwiftClass>
在obj-c .m类中导入“ Productname-swift.h” 使用
[SwiftClass storeWithData:@"Hi" password:@"secret"];
SwiftClass.swift
@objcMembers class SwiftClass{
public class func store(data: String,password:String)->Bool{
let saveSuccessful: Bool = KeychainWrapper.standard.set(data, forKey: password)
return saveSuccessful;
}
}