我在 Swift 中定义了两个不同的函数,只是为了测试如何从 Objective-C 中调用……其中一个有效,一个无效!
我在这里定义了它们:
public extension UIViewController {
func testAddingOperationTo(array: inout [Operation]) -> Operation {
let completionBlock = BlockOperation (block: {
print("completionOperation")
})
return completionBlock;
}
func testSomethingWith (count: Int){
print("testing something \(count)")
}
}
在 Objective-C 中,我已经导入了正确的头文件,我可以很好地调用第二个方法:
[self testSomethingWithCount:0];
但是第一个不起作用...它不会出现在 Xcode 自动完成中,即使我手动输入它,它也会出现构建错误。我想这样调用它:
NSOperation *completionOperation = [self testAddingOperationToArray: operationsList];
这里有什么问题?我是否错误地定义了函数,或者是否有一些我不知道的关于 Swift 的晦涩规则?
最佳答案
您可以将 @objc
放在方法声明的前面,以告诉 Swift 编译器您特别想要使用来自 Objective-C 的方法。除其他影响外,如果由于某种原因无法从 Objective-C 调用该方法,这会使编译器发出错误消息:
@objc func testAddingOperationTo(array: [Operation]) -> Operation {
// Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C
如果编译器告诉您未表示哪个参数的类型会很好,但从 Xcode 9 beta 2 开始,它不会。
无论如何,这种情况下的问题是 Swift inout
参数无法在 Objective-C 中表示。如果您不需要参数为 inout
,只需删除该关键字,该方法将桥接到 Objective-C。
如果您需要传入函数可以修改的数组,一种方法是添加另一个采用 NSMutableArray
的版本。第二个版本桥接到 Objective-C:
func testAddingOperation(to array: inout [Operation]) {
let completionBlock = BlockOperation (block: {
print("completionOperation")
})
array.append(completionBlock)
}
@objc func testAddingOperation(toOperations mutableArray: NSMutableArray) {
var array = mutableArray.map({ $0 as! Operation })
testAddingOperation(to: &array)
mutableArray.replaceObjects(in: NSRange(location: 0, length: mutableArray.count), withObjectsFrom: array)
}
关于objective-c - 无法从 Objective-c 调用一些 Swift 函数(其他的可以),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44732807/