gpt4 book ai didi

objective-c - 无法从 Objective-c 调用一些 Swift 函数(其他的可以)

转载 作者:行者123 更新时间:2023-11-28 10:54:02 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com