如何使用Objective C类中的多个参数调用Swift函数?

时间:2014-09-17 09:39:30

标签: ios objective-c xcode swift

例如我在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

  • 要在Objective-C中可访问和使用,Swift类必须是Objective-C类的后代,或者必须标记为@objc。

3 个答案:

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