gpt4 book ai didi

objective-c - 使用 Objective-C 类别扩展 Swift 类

转载 作者:IT王子 更新时间:2023-10-29 05:10:15 32 4
gpt4 key购买 nike

我处于需要使用 Objective-C 类别来扩展 Swift 类的情况。我做了如下事情:

在“SomeClass.swift”中:

class SomeClass: NSObject {
}

在“SomeClass+Extension.h”中:

#import "Project-Swift.h"
@interface SomeClass (Extension)
-(void)someMethod();
@end

这很有效。如果我尝试在我的 Objective C 代码中使用 SomeClass 扩展,那没问题。

问题是,如果我想在另一个 Swift 类中使用 someMethod(),我需要将 SomeClass+Extension.h 文件放入我的 ObjC-BridgingHeader.h 文件。

但是这样做会造成循环依赖,因为SomeClass+Extension.h同时导入了Project-Swift.h

有没有人有解决这个问题的好方法?

请注意,在类别标题中简单地向前声明类是行不通的,因为类别不能像这样对其自己的实现使用向前声明:

@class SomeClass 不导入 Project-Swift.h 会给出编译错误。

最佳答案

坏事

我也一直在和这个问题作斗争。不幸的是 documentation非常明确地指出不允许使用此模式:

To avoid cyclical references, don’t import Swift code into an Objective-C header (.h) file. Instead, you can forward declare a Swift class or protocol to reference it in an Objective-C interface.

Forward declarations of Swift classes and protocols can only be used as types for method and property declarations.

在整个链接页面中,您还会注意到它不断提到将生成的 header 专门导入到 .m 文件中:

To import Swift code into Objective-C from the same target

Import the Swift code from that target into any Objective-C .m file within that target

好的

一个可能对您有用的解决方案是创建一个 swift 扩展,重新定义您在类别中需要的每个方法。它既脆弱又丑陋,但可以说是最干净的解决方案。

/**
Add category methods from objc here (since circular references prohibit the ObjC extension file)
*/
extension SomeClass {
@nonobjc func someMethod() {
self.performSelector(Selector("someMethod"))
}
}
  • @noobjc 添加到前面允许使用相同的方法签名 w/o 覆盖 ObjC 实现
  • 现在 从桥接中导入“SomeClass+Extension.h”标题可以删除

如果需要支持两个以上的输入参数,或者需要更紧密的类型耦合,我建议使用运行时来调用底层函数。一个很好的描述是here .

关于objective-c - 使用 Objective-C 类别扩展 Swift 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36563387/

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