如何更改Swift类的命名空间?

时间:2015-01-15 23:33:20

标签: objective-c xcode swift xcode6 nsarchiving

Swift 中实施课程MyGreatClass时,其完全限定名称将由<MyPackageName>.MyGreatClass生成。这与 Objective-C 不同,其中同一类的完全限定名称为MyGreatClass

不幸的是,这给我带来了一个问题。当我使用NSUnarchiver并且存档是使用 Objective-C 对象编写时,我无法使用 Swift 类对其进行解压缩(请参阅下面的详细说明)。

这意味着我需要找到一种方法来重命名我的 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课程却没有? 例如var x = XRObjectAllocRun()中的main.swift没有问题,但NSUnarchiver仍然抱怨XRObjectAllocRun课时我完全不在Swift范围内。 NSUnarchiver是否在错误的位置 - 是否由于某种原因只接受Objective-C类?

如果您想知道我要做什么,请查看stackoverflow question

更新

这就是苹果写的:

  

Swift类基于它们编译的模块进行命名空间化,即使在使用Objective-C代码时也是如此。与Objective-C不同,其中所有类都是全局命名空间的一部分

更多:

  

例如,当您创建基于文档的Mac应用程序时,您可以在应用程序的Info.plist文件中提供NSDocument子类的名称。在Swift中,您必须使用文档子类的全名,包括从应用程序或框架名称派生的模块名称。

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

1 个答案:

答案 0 :(得分:5)

宣布你的课时试试这个:

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

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

当您从Objective-C转换为Swift并且您已经有一个现有的存档要处理时,这始终是一个问题。请参阅Apple的文档:

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

请注意“在Objective-C中公开Swift接口”下的讨论。