如何更改Swiftclass的命名空间?

How to change the namespace of a Swift class?

当您在 Swift 中实现 class MyGreatClass 时,其完全限定名称将变为 <MyPackageName>.MyGreatClass。这与 Objective-C 不同,其中 class 的完全限定名称是 MyGreatClass.

不幸的是,这给我带来了问题。当我使用 NSUnarchiver 并且存档是用 Objective-C 对象写入时,我无法用 Swift[=86= 解压它]-classes(详见下文)。

这意味着我需要找到一种方法来重命名我的 Swift classes 的命名空间。我该怎么做?

任何帮助都会很棒!

背景:为什么 NSUnarchiver see/load 我的 swift class 不能?

我已经实现了一个读取文件的小程序,该文件用 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 文件中添加完全相同的 class 时,带有 桥接头 文件我没有问题。

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 class 被发现了,而我的 Swift class 却找不到? Swift 没有问题例如 var x = XRObjectAllocRun()main.swift,但是 NSUnarchiver 仍然抱怨缺少 XRObjectAllocRun class 当我纯在 Swift 内。 NSUnarchiver 是否在错误的地方查找 - 它是否出于某种原因只接受 Objective-C classes?

如果你想知道我想做什么,请查看此

更新

苹果是这样写的:

Swift classes are namespaced based on the module they are compiled in, even when used from Objective-C code. Unlike Objective-C, where all classes are part of a global namespace

还有:

For example, when you create a document–based Mac app, you provide the name of your NSDocument subclass in your app’s Info.plist file. In Swift, you must use the full name of your document subclass, including the module name derived from the name of your app or framework.

哎呀,想弄清楚现在的混乱...

当你声明你的class时试试这个:

@objc(XRObjectAllocRun) class XRObjectAllocRun: NSObject {
    // class to be implemented   
}

这将使这个 class 与存档的 class 具有相同的名称,即 XRObjectAllocRun,而不是命名空间 Swift 名称 trace_file_reader.XRObjectAllocRun

当您从 Objective-C 翻译成 Swift 并且您有一个现有的存档要处理时,这总是一个问题。请参阅 Apple 的文档:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html

请注意 "Exposing Swift Interfaces in Objective-C" 下的讨论。