如何使用自定义Swift类声明Objective-C方法

如何使用自定义Swift类声明Objective-C方法,swift,objective-c,mix-and-match,Swift,Objective C,Mix And Match,我想声明一个Objective-C方法,其中一个参数是自定义Swift类,如下所示: + (void)doCalculationsWithACustomSwiftObject:(CustomSwiftClass *)swiftObject andADictionanary:(NSDictionary *)ordinaryDictionary; 其目的是从Swift调用此方法,传递自定义类“CustomSwiftClass.Swift”的实例,以便Objective-C代码可以访问其属性。有可能

我想声明一个Objective-C方法,其中一个参数是自定义Swift类,如下所示:

+ (void)doCalculationsWithACustomSwiftObject:(CustomSwiftClass *)swiftObject andADictionanary:(NSDictionary *)ordinaryDictionary;
其目的是从Swift调用此方法,传递自定义类“CustomSwiftClass.Swift”的实例,以便Objective-C代码可以访问其属性。有可能吗?如果有,我如何声明“CustomSwiftClass”以使编译器接受它?

一些想法:

  • 为了使您的Objective-C代码可以访问Swift类,您必须导入系统生成的标题。正如文件所说:

    将Swift代码导入Objective-C时,依赖Xcode生成的头文件向Objective-C公开这些文件。此自动生成的文件是Objective-C头文件,用于声明目标中的Swift接口。可以将其视为Swift代码的伞形标题。此标题的名称是您的产品模块名称,后跟添加
    “-Swift.h”
    。(稍后,您将在中了解有关产品模块名称的更多信息。)

    例如,您的Objective-C文件将导入此生成的标头:

    #import "MyApp-Swift.h"
    
    有关更多信息,请参阅使用中的将Swift导入Objective-C部分

  • 如果您没有看到
    xxx Swift.h
    文件,请仔细检查您的目标设置:

    (注意,我在设置中搜索了“swift”以缩小结果范围。)

    如您所见,以下各项均已设置:

    • “安装Objective-C兼容头”设置为“是”

    • 设置“Objective-C生成的接口头名称”(并匹配我导入到Objective-C代码中的名称)

    • 还规定了“Objective-C桥接头”

      注意,Objective-C桥接头表面上只是为了使Objective-C类可用于Swift代码(您目前正试图实现相反的目的),但我注意到这也会影响兼容性头中生成的代码。因此,请确保您也有一个桥接头

  • 当然,请确保您的Swift文件包含在编译源列表中:

  • 并确保该类是从
    NSObject
    子类化的:

    import UIKit
    
    class MyObject: NSObject {
        var text: String?
        var value: Int = 0
    }
    
  • 注意,某些Swift类型不适用于Objective-C代码。例如,Objective-C不能使用某些可选类型(例如,
    Int?
    等可选类型将不起作用,而
    String?
    等可选类类型将起作用)。因此,如果您看到的是类,但不是某些属性,请确保它们与Objective-C兼容

    但是我从你的问题中得出结论,你有更基本的问题,你根本找不到
    -Swift.h
    标题。但一旦你解决了这个问题,这是对单个属性的考虑


  • 在Swift类前面添加
    @objc
    declaration@SteveWilford已经尝试过了,但编译器仍然不接受该类。导入/包含/类声明在Objective-C头文件中应该是什么样子?你的意思是什么?@turingtested有一个用于Swift/Objective-C混合和匹配的
    桥接头标记(不幸的是,该标记还没有描述)。我同意我们可以有更有用的东西。我已经做了所有这些。你的回答很好地介绍了Swift和Objective-C的混合搭配。但这并不能解决我的问题,也许你误解了这个问题。当然,我使用的是Objective-C桥接头,因为我是从Swift调用这个方法的。我刚才注意到,
    #import“MyApp Swift.h”
    在.m文件中运行良好!但这不是问题所在,问题在于如何用自定义Swift类作为参数声明方法。然后必须在.h文件中进行导入,这会导致错误。至少对我来说。@turingtested-如果你有一个Objective-C函数,它以“swift object”作为参数,你只需(a)
    #在
    .m
    文件中导入“MyApp swift.h”
    (或者如果这个方法是在Objective-C类的公共界面中定义的,那么在
    .h
    文件中导入
    ),然后(b)如问题所示准确地声明函数。如果它不识别
    CustomSwiftClass
    ,那么我会打开
    MyApp Swift.h
    文件(也就是说,只需按一下命令),并确保您看到在那里定义的自定义类。你可能看不到它,因为我上面列举的众多原因中的任何一个。