Вызов функции Swift с параметрами из класса Objective C - PullRequest
0 голосов
/ 03 октября 2018

У меня есть класс библиотеки, написанный на swift, который должен использоваться в моем существующем коде Objective-C.Я создал bridging-header и определил @class MySwiftClass в .h и импортировал "-Swift.h" в .m

, а swift-класс похож на этот

@objc class MySwiftClass: NSObject {
    var firstName : String
    var lastName: String

    public init(firstName: String, lastName: String) throws {
        guard !firstName.isEmpty && !lastName.isEmpty else { throw SOME_ERROR }
        self.firstName = firstName
        self.lastName = lastName
        super.init()
    }


func methodWithParams(city: String, suburb: String) throws -> String {
        return city + suburb
    }

Я столкнулся с двумя проблемами:

  1. Не знаю, как вызвать функцию swift init в классеjective-c.Я пытался MySwiftClass *myClass = [MySwiftClass init];.До этого приложение может компилироваться.Но не знаю, как передать параметры.

  2. Я также хочу получить доступ к myClass.methodWithParams(city:"My city", suburb:"My country") в классе Objective-C.

Оценитьпомощь!

Ответы [ 2 ]

0 голосов
/ 03 октября 2018
  1. Вы должны вызывать alloc до вызова init.

    MySwiftClass* instance = [[MySwiftClass alloc] initWithFirstName: @"John" lastName: @"Doe"];
    
  2. Пометьте метод с помощью @objc или используйте @objcMembers, чтобы сделать ваш метод доступным для Objective-C код.И, к сожалению, вы не можете использовать инициализируемые инициализаторы в Objective-C.

    @objcMembers class MySwiftClass: NSObject {
        var firstName : String
        var lastName: String
    
        public init(firstName: String, lastName: String) throws {
            guard !firstName.isEmpty && !lastName.isEmpty else { throw SOME_ERROR }
            self.firstName = firstName
            self.lastName = lastName
            super.init()
        }
    
        func methodWithParams(city: String, suburb: String) throws -> String {
            return city + suburb
        }
    }
    
0 голосов
/ 03 октября 2018

Для создания экземпляра объекта в Objective-C…

NSError *error = NULL;
MySwiftClass *class = [[MySwiftClass alloc] initWithFirstName: @"John"
                                                     lastName: @"Smith" 
                                                        error: &error]

для вызова метода

[class methodWithParamsWithCity: @"My CIty" suburb: @"My suburb" error: &error];

throws в Swift добавляется параметр NSError ** error в Objective-C

...