热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何更改Swift类的名称空间?》经验,为你挑选了1个好方法。

当您MyGreatClassSwift中实现一个类时,其完全限定名称将为.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 
@interface XRObjectAllocRun : NSObject
@end

XRObjectAllocRun.m

#import "XRObjectAllocRun.h"
@implementation XRObjectAllocRun
@end

我想念什么?为什么Objective-C找到我的Swift班级却找不到我的班级?斯威夫特的var x = XRObjectAllocRun()in 并没有问题main.swift,但是当我纯粹呆在里面的时候,NSUnarchiver仍然抱怨缺少XRObjectAllocRun班级Swift。是NSUnarchiver在错误的位置查找-是否出于某种原因仅接受Objective-C类?

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

更新资料

这是苹果写的:

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

更多:

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

Yikes,现在想弄清楚那一团糟...



1> matt..:

声明课程时,请尝试以下操作:

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

这将为该类提供与存档类相同的名称XRObjectAllocRun,而不是命名空间的Swift name trace_file_reader.XRObjectAllocRun

从Objective-C转换为Swift并拥有现有存档时,这始终是一个问题。请参阅Apple的文档:

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

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


在我的新Swift教程中,我还讨论了其他一些使用@objc(...)的地方:http://www.apeth.com/swiftBook/apa.html#_objective_c_objects_and_swift_objects
推荐阅读
author-avatar
血流的风霜_565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有