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

标签 objective-c swift

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

相关文章:

ios - 无法将数组添加到具有空数组的字典中

objective-c - Xib 没有出现在 View 中

objective-c - NSView鼠标跟踪

objective-c - 尝试将 subview 添加到导航栏

ios - 通过函数使用Gesture时类型 'any View'不能符合 'View'

ios - 如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?

ios - 如何以编程方式更改带有 "viewWithTag"的图像?

objective-c - Cocoa:拖放任何文件类型

iphone - 类型转换 UIView 警告

ios - 更多按钮在 tabbbaritem 中不可见