Как вызвать функцию Swift с несколькими параметрами класса Objective C?

Например, у меня есть этот метод в 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"];. Я помню, что читал в документации.

Перенос кода objective-c в Swift

  • Чтобы быть доступным и полезным в Objective-C, класс Swift должен быть потомком класса objective-c или должен быть помечен как @objc.

Ответ 1

Это работало для меня в Swift 3.0

public class func viewWithIndex(_ index: Int, str: String) {
    println(index, str)
}

Добавление подчеркивания перед первым параметром в объявлении Swift позволило мне вызвать из объектива c без наименования первого параметра, например:

[MyClass viewWithIndex:10 str:@"string"]

Ответ 2

Я считаю, что вам нужно отметить функцию как общедоступную (имеет смысл) или динамическую. В противном случае он станет кандидатом на оптимизацию 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)
}

Ответ 3

переслать объявление вашего класса в .h файл target-c

@class <MySwiftClass>

импортировать "Productname-swift.h" в классе obj-c.m использовать

[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;
  }
}