当你MyGreatClass
在Swift中实现一个类时,它的完全限定名将由<MyPackageName>.MyGreatClass
. 这与Objective-C不同,其中同一个类的完全限定名称是MyGreatClass
.
不幸的是,这给我带来了一个问题。当我使用NSUnarchiver
并且归档是用Objective-C对象编写的时,我无法使用Swift -classes 解压缩它(详细说明见下文)。
这意味着我需要找到一种方法来重命名我的Swift类的命名空间。我怎么做?
任何帮助都会很棒!
背景:为什么 NSUNarchiver 看不到/加载我的 swift 类?
我已经实现了一个小程序来读取一个文件,该文件以NSArchive
.
这些是我的文件:
main.swift
:
import Foundation
// parse command line - total path to *.trace file (from Apple's Instruments app)
var traceFilePath = Process.arguments[1]
var traceFile = NSURL(fileURLWithPath: traceFilePath)
var error:NSError?
// check if the file exists
if (traceFile?.checkResourceIsReachableAndReturnError(&error) == false){
// file does not exist or cannot be accessed
println("\(error)")
exit(1)
}
var rawData = NSData(contentsOfURL: traceFile!)
var data = NSUnarchiver(forReadingWithData: rawData!)
var decodedObject: AnyObject? = data?.decodeObject()
XRObjectAllocRun.swift
:
import Foundation
class XRObjectAllocRun: NSObject {
// class to be implemented
}
当我现在在Instruments文件上运行我的应用程序时,我收到以下错误:Terminating app due to uncaught exception 'NSArchiverArchiveInconsistency', reason: '*** class error for 'XRObjectAllocRun': class not loaded'
.
这真的很奇怪,因为当我在带有 桥接头文件的Objective-C文件中添加完全相同的类时,我没有任何问题。
trace file reader-Bridging-Header.h
: 是空的。
XRObjectAllocRun.h
:
#import <Foundation/Foundation.h>
@interface XRObjectAllocRun : NSObject
@end
XRObjectAllocRun.m
:
#import "XRObjectAllocRun.h"
@implementation XRObjectAllocRun
@end
我错过了什么?为什么找到了我的Objective-C
班级,而Swift
没有找到我的班级?Swift 没有问题,例如var x = XRObjectAllocRun()
in main.swift
,但是当我纯粹留在in 时,NSUnarchiver
仍然抱怨缺少课程。是否在错误的地方寻找 - 它是否出于某种原因只接受 Objective-C 类?XRObjectAllocRun
Swift
NSUnarchiver
如果您想知道我要做什么,请检查这个stackoverflow 问题。
更新
这是苹果写的:
Swift 类的命名空间基于它们编译所在的模块,即使是在 Objective-C 代码中使用时也是如此。与 Objective-C 不同,所有类都是全局命名空间的一部分
此外:
例如,当您创建基于文档的 Mac 应用程序时,您在应用程序的 Info.plist 文件中提供 NSDocument 子类的名称。在 Swift 中,您必须使用文档子类的全名,包括从您的应用程序或框架名称派生的模块名称。
哎呀,现在想弄清楚这个烂摊子......