4

当你MyGreatClassSwift中实现一个类时,它的完全限定名将由<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 类?XRObjectAllocRunSwiftNSUnarchiver

如果您想知道我要做什么,请检查这个stackoverflow 问题

更新

这是苹果写的:

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

此外:

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

哎呀,现在想弄清楚这个烂摊子......

4

1 回答 1

6

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

@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 接口”下的讨论。

于 2015-01-16T00:34:12.140 回答