【发布时间】:2016-03-24 14:37:40
【问题描述】:
在我的项目中,我对 Objective C 枚举进行了 Swift 扩展,这在 Xcode 7.2 中表现出色。
但是对于 Xcode 7.3,它在我扩展 Obj C 枚举的 Swift 文件中出现“未声明的类型”而失败。
我已经构建了一个示例项目,它可以编译并且运行良好,但我无法让现有项目接受 Obj C 枚举上的扩展。
更新:
重装Xcode 7.2后可以确认项目编译构建成功。
在 Xcode 7.2 中运行后,我尝试在 Xcode 7.3 中再次启动该项目,并再次出现相同的问题 -> 无法构建 Obj C 枚举上的 Swift 扩展。
在 Xcode 7.3 中清理和删除派生数据后,我还收到 -Swift.h 标头丢失错误,因为尚未编译 Swift 类,因此尚未创建标头。
代码说明:
“FriendRequestResult.h”中的我的 Obj C 枚举:
typedef NS_ENUM(NSInteger, FriendStatus)
{
FriendStatusRequestedByUser = 1,
FriendStatusRequestedByOtherUser,
FriendStatusFriends,
FriendStatusBlocked,
FriendStatusNone,
FriendStatusError,
};
现在,正如我的 AppName-Bridging-Header.h 中所预期的那样,我有:
#import "FriendRequestResult.h"
然后,我对在 Xcode 7.2 中构建的 FriendStatus 进行了快速扩展,但在 Xcode 7.3 中因“使用未声明的类型”而失败:
extension FriendStatus
{
init(stringValue : String?)
{
if let stringValue = stringValue
{
switch stringValue
{
case "REQUESTED_BY_USER": self = .RequestedByUser
case "REQUESTED_BY_OTHER": self = .RequestedByOtherUser
case "FRIENDS": self = .Friends
case "BLOCKED": self = .Blocked
default: self = .None
}
}
else
{
self = .None
}
}
}
实际上这个对枚举的扩展还有一些其他的辅助函数,但这不应该以任何方式改变问题。
当然,如果枚举的扩展给出了未声明的类型,那么在 Swift 代码中使用这种类型的任何地方都会失败,并且具有相同的“未声明的东西”。基本上,对于项目的 Swift 部分,枚举根本不可见,即使导入是在桥接头中进行的。
这个问题在第一版的基础上进行了大量编辑。
【问题讨论】:
-
您介意分享一些代码示例吗?
-
@JohnDifool,我会尝试.. 但在这种情况下,确保您共享正确的部分似乎很复杂。
-
我创建了一个新的混合项目,你的
typedef NS_ENUM(NSInteger, FriendStatus)在一个 Objective-C 头文件中,你的extension FriendStatus在一个 Swift 文件中。它编译得很好。你能告诉我如何得到错误吗? -
不幸的是,我不知道究竟是什么导致了这个问题。如问题中所述,我还设法做了一个有效的新样本。如果我知道究竟是什么在 Swift 代码中为 Obj C 枚举创建了“未定义”,我也许能够解决它。如果在Objective C中只有一个像@class这样的指令,您可以通过它向编译器保证存在特定类型......因为我想它还没有设法到达代码的Obj C部分尝试编译 swift 扩展 [即使在示例中它可以工作.. 我知道]
-
好吧,我想说的是创建一个新项目,将所有内容迁移到其中,一切就绪。没有?