在 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 类的主要内容,如果未能解决你的问题,请参考以下文章