gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:20 25 4
gpt4 key购买 nike

当你实现一个类时 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 上运行我的应用程序时-file 我收到以下错误:Terminating app due to uncaught exception 'NSArchiverArchiveInconsistency', reason: '*** class error for 'XRObjectAllocRun': class not loaded' .

这真的很奇怪,因为当我在带有桥接 header 文件的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()main.swift , 但是 NSUnarchiver还在提示失踪XRObjectAllocRun当我完全呆在里面时上课 Swift .是 NSUnarchiver找错地方了——它是否出于某种原因只接受 Objective-C 类?

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

更新

这是苹果写的:

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.

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

最佳答案

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

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

关于objective-c - 如何更改 Swift 类的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com