在 Objective-C 中使用 Swift 类

Posted

技术标签:

【中文标题】在 Objective-C 中使用 Swift 类【英文标题】:Using Swift class inside Objective-C 【发布时间】:2015-07-29 22:22:45 【问题描述】:

我在尝试#import "DodgeHeroReal-Swift.h 时收到file not found 错误。我的产品模块名称设置为DodgeHeroReal,定义模块也设置为YES(在目标级别和项目级别都用于构建设置)。我已经有一个由 Xcode 生成的桥接头。我有一个 swift 类 emojisClass,我希望能够在我的 Objective-C ViewController EmojiShopViewController 中使用它。我查看了许多关于混合 objc 和 swift 项目的精彩 *** 帖子,但没有一个解决方案建议似乎工作。我也查看了 Apple 文档页面,但这也无济于事。有人可以指导我如何在我的 ViewController.m 中使用以下 swift 类吗? 这里是GlobalFunc.swift(有emojisClass这个类)

@objc(EmojiClass) class emojisClass 
    @objc(buyAngle) func buyAngle()
        if(emotiBucks >= 10000)
             var value = emotiBucks-10000
             NSUserDefaults.standardUserDefaults().setBool(true, forKey: "haveAngleEmoji")
            NSUserDefaults.standardUserDefaults().setInteger(value, forKey: "emotiBucks")
            NSUserDefaults.standardUserDefaults().synchronize()
        
    
    func buyAlien()
        if(emotiBucks >= 2000)
            var value = emotiBucks-2000
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "haveAlienEmoji")
            NSUserDefaults.standardUserDefaults().setInteger(value, forKey: "emotiBucks")
            NSUserDefaults.standardUserDefaults().synchronize()
        
    
    func buySassy()
        if(emotiBucks >= 5000)
            var value = emotiBucks-5000
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "haveSassyEmoji")
            NSUserDefaults.standardUserDefaults().setInteger(value, forKey: "emotiBucks")
            NSUserDefaults.standardUserDefaults().synchronize()
        
    
    func buyHeart()
        if(emotiBucks >= 3000)
            var value = emotiBucks-3000
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "haveHeartEmoji")
            NSUserDefaults.standardUserDefaults().setInteger(value, forKey: "emotiBucks")
            NSUserDefaults.standardUserDefaults().synchronize()
        
       

我已经在我的 EmojiShopviewController.m 中导入了桥接头:#import "Dodge Hero-Bridging-Header.h"。现在我希望能够调用在我的 swift 文件中声明的函数 buyAngle()。

编辑:该项目最初是一个 swift 项目,然后我添加了 Obj-C 文件,然后是 Bridging-Header。所以该项目包含 .swift 和 objc 文件,现在我希望能够在不删除任何当前文件的情况下生成 ProductModule-Swift.h

编辑 2:运行 find * -iname '*Swift.h',然后在我的 DerivedData 目录中的终端中运行 CMD+F 会返回以下内容:

****** Other stuff ********
DodgeHeroReal-gmmvxsfrydixythkdwqjpncbqlpl/Build/Intermediates/DodgeHeroReal.build/Debug-iphonesimulator/DodgeHeroRealTests.build/DerivedSources/DodgeHeroReal-Swift.h
DodgeHeroReal-gmmvxsfrydixythkdwqjpncbqlpl/Build/Intermediates/DodgeHeroReal.build/Debug-iphonesimulator/DodgeHeroRealTests.build/DerivedSources/DodgeHeroRealTests-Swift.h
DodgeHeroReal-gmmvxsfrydixythkdwqjpncbqlpl/Build/Intermediates/DodgeHeroReal.build/Debug-iphonesimulator/DodgeHeroRealTests.build/Objects-normal/x86_64/DodgeHeroReal-Swift.h
****** More other stuff ********

【问题讨论】:

【参考方案1】:

我发现有时 swift 文件中的错误会导致无法生成 ProjectName-Swift.h 文件并且没有警告。尝试让所有 swift 文件都没有错误,即使您必须暂时伪造它,例如,通过注释掉某些内容或添加编译没有错误的虚拟代码。此外,请确保您从 Objective-C 引用的 swift 类继承自 NSObject 或其他一些 Objective-C 类,并确保它们没有全部标记为私有。我已经浪费了几天时间试图弄清楚为什么会发生这个错误——这真的很令人沮丧!

请注意,您可以命令单击导入语句中的 Swift->Objective-C 桥接文件的文件名,Xcode 将显示其内容。如果它发出错误哔声,这显然意味着该文件未找到,因此它可能没有生成。

【讨论】:

【参考方案2】:

我遇到过一次,我的问题是同一个 swift 文件中的枚举没有用@objc 标签标记。

【讨论】:

以上是关于在 Objective-C 中使用 Swift 类的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中使用 Swift 类

在 Objective-C 中使用通用 Swift 类

在 Objective-c 中使用 swift 类

无法在 Swift 中扩展 Objective-C 类

在objective-c中使用swift代码时的问题

无法在框架项目的 Objective-C 代码中导入 Swift 类