objective-c – 在Swift中实现NSCoding协议有什么问题

objective-c – 在Swift中实现NSCoding协议有什么问题,第1张

概述我认为我会谨慎,并通过转换一个类来尝试在现有的Obj-C项目上使用 Swift.还有一个小而简单的.噢亲爱的. 将原始的obj-c音译为Swift应该是直截了当的,所以看起来如此.不幸的是,虽然编码器到持久存储似乎有效,但它在init编码器的第一行出现EXC_BREAKPOINT错误而崩溃. IF(和大写是有意的)NSCoding / Swift提供与NSCoding / ObjC相同的持久内容, 我认为我会谨慎,并通过转换一个类来尝试在现有的Obj-C项目上使用 Swift.还有一个小而简单的.噢亲爱的.

将原始的obj-c音译为Swift应该是直截了当的,所以看起来如此.不幸的是,虽然编码器到持久存储似乎有效,但它在init编码器的第一行出现EXC_BREAKPOINT错误而崩溃.

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

总而言之,我可以在obj-c中读/写.我不能写/ obj-c和read / swift我可以写/ swift read / obj-c而且我无法在swift中读/写.

以下是两个版本:

let keyBeaconItemnameKey = "name"let keyBeaconItemUUIDKey = "uuID"let keyBeaconItemmajorValueKey = "major"let keyBeaconItemminorValueKey = "minor"import UIKitimport CoreLocationclass 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作为名称的类型.在Apple推出的测试版中,String(奇怪的是)不是Nsstring的一对一替代品.即,缺少某些方法,需要调用.brIDgetoObjectiveC()来获取Nsstring版本.使用该类型可能会符合NSCoder的期望,尽管这种差异不应该如此.

我没有真正测试这个说法,因为我不在我的开发机器上.但这是我的直觉.尝试一下,看看会发生什么!如果没有任何变化,请尝试切换您设置变量的顺序,看看它是否与名称字段相关或仅仅是init函数的第一行.

总结

以上是内存溢出为你收集整理的objective-c – 在Swift中实现NSCoding协议有什么问题全部内容,希望文章能够帮你解决objective-c – 在Swift中实现NSCoding协议有什么问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1239581.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存