【发布时间】:2014-06-25 19:21:57
【问题描述】:
我认为我会谨慎并通过转换一个类来在现有的 Obj-C 项目上试用 Swift。还有一个小而简单的。亲爱的。
将原始的 obj-c 音译成 Swift 应该很简单,看起来也是如此。不幸的是,虽然持久存储的编码器似乎可以工作,但它在 init 编码器的第一行出现 EXC_BREAKPOINT 错误而崩溃。
如果(并且大写是有意的)NSCoding/Swift 提供与 NSCoding/ObjC 相同的持久内容,那么我的所有 obj-c 版本应该能够读取 Swift 编码的内容,反之亦然。事实证明并非如此 - 我的完美运行的 obj-c 版本在尝试从 Swift 版本中读取持久存储时崩溃了。当然,如果 NSCoding 被正确实现,它应该在一个中生成一些在另一个中可读的东西?否则,应该有单独的 NSCodingSwift 和 NSCodingObjC 协议?
所以,总而言之,我可以在 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
感谢您提供的任何帮助。
【问题讨论】:
-
也许勇敢但匿名的人否决了这个投票会足够亲切地解释一下吗?我已经做了几个小时的研究,这是相关的。并非所有人都有时间快速重写我们所有的代码,但我们都在认真尝试与时俱进。如果你这么聪明,请告诉我我没有做什么。
-
它适用于我,将 ObjC 编码为 Swift,将 Swift 编码为 Objc。我认为您发布的代码没有任何问题。该问题可能与您设置 NSKeyedArchiver 和 NSKeyedUnarchiver 的方式有关。如果在 ObjC 中失败,调试控制台上应该会有更多错误信息。
-
谢谢,达伦。如果我注释掉读回 name 属性的尝试(并将值设置为文字),那么它就可以工作。 init 的其余部分工作正常。调试控制台上的唯一信息是错误 EXC_BREAKPOINT,代码 = 1,子代码 = 0x1000a26e0,我找不到解释。
-
我猜这是因为你的 swift 类名被弄乱了,试着把 @objc(SMBeaconItem) 放在你的类声明之前。
-
当你继承 NSObject 时,为什么不在 Init 方法中调用 Super - 你可能不应该继承 NSObject?还是打电话给super?
标签: objective-c swift