Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何更改Swift类的命名空间?_Objective C_Xcode_Swift_Xcode6_Nsarchiving - Fatal编程技术网

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

Objective c 如何更改Swift类的命名空间?,objective-c,xcode,swift,xcode6,nsarchiving,Objective C,Xcode,Swift,Xcode6,Nsarchiving,当您在Swift中实现一个类MyGreatClass时,它的完全限定名将由.MyGreatClass指定。这与Objective-C不同,在这里,同一类的完全限定名是MyGreatClass 不幸的是,这给我带来了一个问题。当我使用nsunachiver时,归档文件是用Objective-C对象编写的,我无法用Swift-类将其解包(详细说明见下文) 这意味着我需要找到一种方法来重命名我的Swift类的名称空间。我该怎么做 任何帮助都会很好 背景:为什么Narchiver无法查看/加载我的swi

当您在Swift中实现一个类
MyGreatClass
时,它的完全限定名将由
.MyGreatClass
指定。这与Objective-C不同,在这里,同一类的完全限定名是
MyGreatClass

不幸的是,这给我带来了一个问题。当我使用
nsunachiver
时,归档文件是用Objective-C对象编写的,我无法用Swift-类将其解包(详细说明见下文)

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

任何帮助都会很好

背景:为什么Narchiver无法查看/加载我的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   
}
当我现在在一个-文件上运行我的应用程序时,我收到以下错误:
由于未捕获的异常“NSArchiverArchiveInconsistency”而终止应用程序,原因:“***XRObjectAllocRun的类错误:未加载类”

这真的很奇怪,因为当我在带有桥接头文件的Objective-C文件中添加完全相同的类时,我没有任何问题

跟踪文件读取器桥接头.h
:为空

XRObjectAllocRun.h

#import <Foundation/Foundation.h>
@interface XRObjectAllocRun : NSObject
@end
我错过了什么?为什么找到了我的
Objective-C
类,而没有找到我的
Swift
类? 例如,Swift没有问题,比如
main.Swift
中的
var x=XRObjectAllocRun()
,但是
nsunachiver
仍然抱怨当我完全呆在
Swift
中时,缺少
XRObjectAllocRun
类。
nsunachiver
是否在错误的位置查找-出于某种原因,它是否只接受Objective-C类

如果你想知道我想做什么,看看这个

更新

这是苹果写的:

Swift类根据编译它们的模块命名,即使是从Objective-C代码使用。与Objective-C不同,Objective-C中的所有类都是全局命名空间的一部分

此外:

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


Yekes,现在就想弄清楚这个乱七八糟的东西…

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

@objc(XRObjectAllocRun) class XRObjectAllocRun: NSObject {
    // class to be implemented   
}
这将使该类与存档类具有相同的名称,即
XRObjectAllocRun
,而不是名称空间的Swift名称
trace_file_reader.XRObjectAllocRun

当您从Objective-C翻译到Swift,并且您需要处理现有的归档文件时,这始终是一个问题。请参阅苹果的文档:


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

问题可能是代码中没有实际引用XRObjectAllocRun?我认为它不会加载,除非其他代码讨论它。这是我最初的想法。但是我在
var rawData=NSData(contentsofull:traceFile!)之前添加了
var x=XRObjectAllocRun()
,仍然得到了相同的错误。当我在崩溃前检查
x
时,我看到
(trace_file_reader.XRObjectAllocRun)$R0=0x0000000102000040(ObjectiveC.NSObject={})
这是
Objective-C
对象在调试控制台上打印的内容:
(XRObjectAllocRun)$R0=0x00000001020004b0{ObjectiveC.NSObject={}
。注意区别:(swift)
trace_file_reader.XRObjectAllocRun
vs(ObjC)
XRObjectAllocRun
。我可以在swift中以某种方式删除名称空间吗?是的,您可以使用
@objc(XRObjectAllocRun)
声明它。我想这可能就是答案。我会回答的!干得好,在你做了所有的侦查工作之后,你真的修改了这个问题,并且很好地集中了注意力。否则我想不出答案!在我新的Swift教程中,我还谈到了其他一些有用的地方,
@objc(…)
@objc(XRObjectAllocRun) class XRObjectAllocRun: NSObject {
    // class to be implemented   
}