在 Swift 中实施课程MyGreatClass
时,其完全限定名称将由<MyPackageName>.MyGreatClass
生成。这与 Objective-C 不同,其中同一类的完全限定名称为MyGreatClass
。
不幸的是,这给我带来了一个问题。当我使用NSUnarchiver
并且存档是使用 Objective-C 对象编写时,我无法使用 Swift 类对其进行解压缩(请参阅下面的详细说明)。
这意味着我需要找到一种方法来重命名我的 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
课程却没有?
例如var x = XRObjectAllocRun()
中的main.swift
没有问题,但NSUnarchiver
仍然抱怨XRObjectAllocRun
课时我完全不在Swift
范围内。 NSUnarchiver
是否在错误的位置 - 是否由于某种原因只接受Objective-C类?
如果您想知道我要做什么,请查看stackoverflow question。
更新
这就是苹果写的:
Swift类基于它们编译的模块进行命名空间化,即使在使用Objective-C代码时也是如此。与Objective-C不同,其中所有类都是全局命名空间的一部分
更多:
例如,当您创建基于文档的Mac应用程序时,您可以在应用程序的Info.plist文件中提供NSDocument子类的名称。在Swift中,您必须使用文档子类的全名,包括从应用程序或框架名称派生的模块名称。
哎呀,试着弄清楚现在的混乱......
答案 0 :(得分:5)
宣布你的课时试试这个:
@objc(XRObjectAllocRun) class XRObjectAllocRun: NSObject {
// class to be implemented
}
这将使该类与归档类具有相同的名称,即XRObjectAllocRun
,而不是命名空间的Swift名称trace_file_reader.XRObjectAllocRun
。
当您从Objective-C转换为Swift并且您已经有一个现有的存档要处理时,这始终是一个问题。请参阅Apple的文档:
请注意“在Objective-C中公开Swift接口”下的讨论。