gpt4 book ai didi

objective-c - Swift 中 NSCoding 协议(protocol)的实现有什么问题

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:00 29 4
gpt4 key购买 nike

我认为我会谨慎并通过转换一个类在现有的 Obj-C 项目上试用 Swift。还有一个小而简单的。哦,亲爱的。

将原始的 obj-c 音译成 Swift 应该很简单,看起来也是如此。不幸的是,虽然持久存储的编码器似乎可以工作,但它在初始化编码器的第一行崩溃并出现 EXC_BREAKPOINT 错误。

如果(并且大写是有意的)NSCoding/Swift 提供与 NSCoding/ObjC 相同的持久内容,那么我的所有 obj-c 版本应该能够读取 Swift 编码的内容,反之亦然。事实证明并非如此——当我尝试从 Swift 版本读取持久存储时,我的完美运行的 obj-c 版本崩溃了。当然,如果 NSCoding 实现正确,它应该在一个中生成一些在另一个中可读的东西?否则,应该有单独的 NSCodingSwift 和 NSCodingObjC 协议(protocol)?

所以,总而言之,我可以在 obj-c 中读/写。我不能写/obj-c 和读/swift,我可以写/swift 读/obj-c,但我不能读/写 swift。

这是两个版本:

let keyBeaconItemNameKey = "name"
let keyBeaconItemUUIDKey = "uuid"
let keyBeaconItemMajorValueKey = "major"
let keyBeaconItemMinorValueKey = "minor"

import UIKit
import CoreLocation

class SMBeaconItem : NSObject, NSCoding
{
var name : String!
var uuid : NSUUID!
var major : NSNumber!
var minor : NSNumber!

init(newName : String, newUUID : NSUUID, newMajor : NSNumber, newMinor : NSNumber )
{
name = newName
uuid = newUUID
major = newMajor
minor = newMinor
}

init( coder decoder : NSCoder!)
{
name = decoder.decodeObjectForKey(keyBeaconItemNameKey) as String
uuid = decoder.decodeObjectForKey(keyBeaconItemUUIDKey) as NSUUID
major = decoder.decodeObjectForKey(keyBeaconItemMajorValueKey) as NSNumber
minor = decoder.decodeObjectForKey(keyBeaconItemMinorValueKey) as NSNumber
}

func encodeWithCoder( encoder: NSCoder!)
{
encoder.encodeObject(name, forKey:keyBeaconItemNameKey)
encoder.encodeObject(uuid, forKey:keyBeaconItemUUIDKey)
encoder.encodeObject(major, forKey:keyBeaconItemMajorValueKey)
encoder.encodeObject(minor, forKey:keyBeaconItemMinorValueKey)
}
}

和工作原件:

@implementation SMBeaconItem

- (instancetype)initWithName:(NSString *)name uuid:(NSUUID *)uuid major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor
{
self = [super init];
if (!self)
{
return nil;
}

_name = name;
_uuid = uuid;
_majorValue = major;
_minorValue = minor;

return self;
}

#pragma mark - Persistence

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (!self)
{
return nil;
}

_name = [aDecoder decodeObjectForKey:keyBeaconItemNameKey];
_uuid = [aDecoder decodeObjectForKey:keyBeaconItemUUIDKey];
_majorValue = [[aDecoder decodeObjectForKey:keyBeaconItemMajorValueKey] unsignedIntegerValue];
_minorValue = [[aDecoder decodeObjectForKey:keyBeaconItemMinorValueKey] unsignedIntegerValue];

return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:keyBeaconItemNameKey];
[aCoder encodeObject:self.uuid forKey:keyBeaconItemUUIDKey];
[aCoder encodeObject:[NSNumber numberWithUnsignedInteger:self.majorValue] forKey:keyBeaconItemMajorValueKey];
[aCoder encodeObject:[NSNumber numberWithUnsignedInteger:self.minorValue] forKey:keyBeaconItemMinorValueKey];
}

@end

感谢您提供的任何帮助。

最佳答案

唯一让我印象深刻的是您使用 String 而不是 NSString 作为 name 的类型。在 Apple 推出的测试版中,String(奇怪的是)并不是 NSString 的一对一替代品。即,缺少某些方法,需要调用 .bridgeToObjectiveC() 来获取 NSString 版本。使用该类型可能会符合 NSCoder 的预期,尽管这种差异不应该如此。

我实际上并没有测试这个声明,因为我不在我的开发机器上。但这是我的直觉。尝试一下,看看会发生什么!如果没有任何变化,请尝试切换设置 vars 的顺序,看看问题是否与 name 字段有关,或者仅仅是与 init 函数的第一行有关。

关于objective-c - Swift 中 NSCoding 协议(protocol)的实现有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416860/

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