Как можно использовать метод в Swift с параметром inout в Objective-C?
Я хочу
func foo(inout stop: Bool) -> Void {
// ...
}
используйте в моей части Objective-C. Но он никогда не генерируется в заголовке Module-Swift.h. Если я помечаю его с помощью @objc,
Метод не может быть помечен как @objc, поскольку тип параметра не может быть представленным в Objective-C
возникает ошибка.
Ответы
Ответ 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
}
Не элегантный способ решить проблему, но важно то, что она должна работать (никогда не пробовала себя).