Подтвердить что ты не робот

Как можно использовать метод в Swift с параметром inout в Objective-C?

Я хочу

func foo(inout stop: Bool) -> Void {
    // ...
}

используйте в моей части Objective-C. Но он никогда не генерируется в заголовке Module-Swift.h. Если я помечаю его с помощью @objc,

Метод не может быть помечен как @objc, поскольку тип параметра не может быть представленным в Objective-C

возникает ошибка.

4b9b3361

Ответ 1

Вы не можете использовать параметр inout при соединении с Objective-C, но вы можете сделать нечто подобное, если вы используете UnsafeMutablePointer<T> (в вашем случае T будет Bool). Это будет выглядеть примерно так:

@objc func foo(stop: UnsafeMutablePointer<Bool>) -> Void {
    if stop != nil {
        // Use the .pointee property to get or set the actual value stop points to
        stop.pointee = true
    }
}

пример

TestClass.swift:

public class TestClass: NSObject {
    @objc func foo(stop: UnsafeMutablePointer<Bool>) -> Void {
        stop.pointee = true
    }
}

Objective-C:

TestClass *test = [[TestClass alloc] init];
BOOL stop = false;
[test foo:&stop];
// stop is YES here

Ответ 2

Аналогично тому, что происходит с генериками, inout не совместим с objc.

Возможным обходным путем является встраивание ваших параметров в класс (который является ссылочным типом, поэтому передается указателем, а не по значению):

@objc class MyFuncParams {
    var stop: Bool

    init(stop: Bool) {
        self.stop = stop
    }
}

и определите функцию, чтобы принять экземпляр этого класса:

func changeParam(params: MyFuncParams) {
    params.stop = true
}

Не элегантный способ решить проблему, но важно то, что она должна работать (никогда не пробовала себя).