我正在构建一个利用NSCoding将NSObject保存到documentPath的应用程序.我这样做没有问题,我只是对某事感到好奇.
我有MACompany,它实现了NSCoding委托方法.
- (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:address_1 forKey:kAddress_1];
[encoder encodeObject:address_2 forKey:kAddress_2];
[encoder encodeObject:city_town forKey:kCity_Town];
[encoder encodeObject:company_name forKey:kCompany_Name];
[encoder encodeObject:country forKey:kCountry];
[encoder encodeObject:date_added forKey:kDate_Added];
[encoder encodeObject:fax forKey:kFax];
[encoder encodeObject:parent_company_website forKey:kWebsite];
[encoder encodeObject:postal_code forKey:kPostal_Code];
[encoder encodeObject:state_province forKey:kState_Province];
[encoder encodeObject:type forKey:kType];
[encoder encodeObject:stores forKey:kStores]; //NSArray of custom NSObjects
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我有一个自定义NSObjects(MAStore)的NSArray.这些对象中的每一个也实现了相同的NSCoding.
但是,我的问题是,当我encodeWithCoder:(NSCoder *)encoder在MAStore中调用方法,并且它到达时[encoder encodeObject:stores forKey:kStores],storesNSArray中存储的所有对象是否都具有encoderWithCoder:(NSCoder *)encoder调用的方法?
编辑
我之所以这么说的原因是我想知道在我投入时间做这样的事情之前它是否会起作用.我有多个带有NSArrays的自定义NSObject,它们包含更多自定义NSObject.要找到它不起作用将是一个漫长的过程.
使用NSCoding和解码值时,有没有办法判断给定键是否存在值?换句话说,我想要做的是......
if([decoder valueExistsForKey:@"myKey"]) //valueExistsForKey is not a real method :(
{
NSInteger *myInt = [decoder decodeValueForKey:@"myKey"];
}
else
{
//handle special case
}
Run Code Online (Sandbox Code Playgroud)
问题是我在我的应用程序中有旧版本的文档没有"myKey"值,如果他们没有它,使用0表示myInt(如果解码不存在的密钥会发生什么)不是我想要的行为.但是,我不能只解码并检查myInt == 0,因为它可能合法地等于0.
由于valueExistsForKey方法似乎不存在,我该如何复制此行为?
我想init(coder aDecoder: NSCoder!)在超类中实现,并通过在运行时调用超类中特定子类的类方法在所有子类中使用它.
class func dummyDict() -> NSDictionary
init(coder aDecoder: NSCoder!) {
for(key,value) in self.class.dummyDict(){
--------------------
^
|
|
Get this from the corresponding subclass at runtime!
NSLog("encoding \(value) for key \(key)")
}
}
Run Code Online (Sandbox Code Playgroud)
子类是否有可能在运行时MySuperClass访问类函数dummyDict()?
我有一个类,类内部是一个(swift)数组,基于全局结构.我想将此类的数组保存到NSUserDefaults.这是我的代码:
struct mystruct {
var start : NSDate = NSDate()
var stop : NSDate = NSDate()
}
class MyClass : NSObject {
var mystructs : [mystruct]
init(mystructs : [mystruct]) {
self.mystructs = mystructs
super.init()
}
func encodeWithCoder(encoder: NSCoder) {
//let val = mystructs.map { $0 as NSObject } //this also doesn't work
let objctvtmrec = NSMutableArray(mystructs) //gives error
encoder.encodeObject(objctvtmrec)
//first approach:
encoder.encodeObject(mystructs) //error: [mystructs] doesn't conform to protocol 'anyobject'
}
}
var records : [MyClass] {
get {
var returnValue …Run Code Online (Sandbox Code Playgroud) 是否可以使用NSCoding?存储元组?我有一个像元组一样的元组((UInt8, UInt8), (UInt8, UInt8)).但是aCoder.encodeObject(myTuple)不起作用.我是否必须将元组转换为NSData或者这绝对不可能?谢谢你的帮助
我收到错误"Type'Ship'在我尝试时没有下标成员:
var coor = ship[index]
Run Code Online (Sandbox Code Playgroud)
我试着这样做
var coor = ship?[index] as? Coordinate
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:"无法在'Ship'类型的非可选值上使用可选链接"
这是我的Ship班级:
import Foundation
class Ship: NSObject, NSCoding {
var shipCoors: [Coordinate]?
var count: Int {
var count = 0
for _ in shipCoors! {
count++
}
return count
}
init(shipCoors: [Coordinate]) {
self.shipCoors = shipCoors
}
required init(coder decoder: NSCoder) {
self.shipCoors = decoder.decodeObjectForKey("shipCoors") as? [Coordinate]
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(shipCoors, forKey: "shipCoors")
}
}
Run Code Online (Sandbox Code Playgroud)
该Coordinate班也是类型的NSObject, NSCoding,等等的对象似乎是在阵列中,当我加载它们(从NSUserDefaults)?我怎么把它们拿出来?!
允许在swift中在CoreData中存储MKPolyline所需的代码是什么?
因此,例如,如果我有一个我想要保存MKPolyline的核心数据实体(比如说"myEntity"),并将"折线"字段添加为可转换的,并将其设置为xcode中的"可转换".还生成了NSManagedObject子类.
myEntity.swift
import UIKit
import CoreData
import MapKit
class myEntity: NSManagedObject {
}
Run Code Online (Sandbox Code Playgroud)
myEntity所+ CoreDataProperties.swift
import Foundation
import CoreData
extension myEntity {
@NSManaged var title: String
@NSManaged var polyline: NSObject?
}
Run Code Online (Sandbox Code Playgroud)
问题 - 允许此功能需要哪些代码?
(我确实注意到这篇文章的目标-c,但是我很难理解/移植/使其工作 - 如何在Core Data中存储来自NSMutable Array的数据?)
我的问题是我检索我的NSArray Store对象,我的所有NSString属性都导致BadAccess错误.int和double属性工作正常!
store.h
@interface Store : NSObject<NSCoding> {
NSString *Name;
NSString *Address;
NSString *Phone;
double GeoLong;
double GeoLat;
int ID;
}
@property (nonatomic, retain) NSString *Name;
@property (nonatomic, retain) NSString *Address;
@property (nonatomic, retain) NSString *Phone;
@property (nonatomic) double GeoLat;
@property (nonatomic) double GeoLong;
@property (nonatomic) int ID;
@end
Run Code Online (Sandbox Code Playgroud)
store.m
@implementation Store
@synthesize Name;
@synthesize ID;
@synthesize Address;
@synthesize Phone;
@synthesize GeoLat;
@synthesize GeoLong;
/** Implentation of the NSCoding protocol. */
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeInt:ID forKey:@"ID"]; …Run Code Online (Sandbox Code Playgroud) 我有一个我希望保存和加载的自定义类.该类包含NSDate,NSString和NSNumber.我在.h文件中实现了NSCoding协议.这是我到目前为止的代码.theDate是一个NSDate.theName是NSString.homeAway是NSNumber.
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:theDate forKey:@"theDate"];
[aCoder encodeObject:theName forKey:@"theName"];
[aCoder encodeObject:homeAway forKey:@"homeAway"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super init])) {
theDate = [aDecoder decodeObjectForKey:@"theDate"];
theName = [aDecoder decodeObjectForKey:@"theName"];
homeAway = [aDecoder decodeObjectForKey:@"homeAway"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码加载我的自定义对象.当我在调试器中使用print-object时,homeAway只显示为实际对象.theDate和theName说0x4e4f150似乎没有指向有效的对象.
[gamesArray setArray:[NSKeyedUnarchiver unarchiveObjectWithFile:path]];
Game *loadedGame = [gamesArray objectAtIndex:gameNumber];
Run Code Online (Sandbox Code Playgroud)
我使用以下代码保存数据:
我用它来调用我的类来创建一个新游戏(我试图保存的自定义类).代码最多为NSDate*aDate = [gameDate date]; 是无关紧要的.
-(void)newGame {
if (homeAway != 0) {
if (dateChanged == 1) {
if ([nameField.text length] > 0) {
[homeButton setImage:[UIImage imageNamed:@"HomeGray.png"] forState:UIControlStateNormal];
[awayButton setImage:[UIImage imageNamed:@"AwayGray.png"] forState:UIControlStateNormal]; …Run Code Online (Sandbox Code Playgroud) xcode memory-management nscoding nskeyedarchiver saving-data
我有以下代码,用于获取已归档的对象的路径
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let path = paths[0] as String
let archivePath = path.stringByAppendingString("archivePath")
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,它会在NSSearchPathForDirectoriesInDomainslldb显示的调用时崩溃
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
Run Code Online (Sandbox Code Playgroud)
在Xcode的变量视图中,我看到路径字符串设置为我所期望的.在Swift中获取用户目录以归档/取消归档对象的正确方法是什么?
更新:
看来这实际上是因为我对NSKeyedUnarchiver的使用而崩溃了:
stopwatches = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as Stopwatch []
Run Code Online (Sandbox Code Playgroud)
Stopwatch是一个实现NSCoding的类,stopwatches是执行unarchiving的视图所拥有的数据源(一组Stopwatches).
更新2:
存档的对象图是Stopwatches数组.NSCoding实现如下:
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeBool(self.started, forKey: "started")
aCoder.encodeBool(self.paused, forKey: "paused")
aCoder.encodeObject(self.startTime, forKey: "startTime")
aCoder.encodeObject(self.pauseTime, forKey: "pauseTime")
aCoder.encodeInteger(self.id, forKey: "id")
}
init(coder aDecoder: NSCoder!) {
self.started = aDecoder.decodeBoolForKey("started")
self.paused = aDecoder.decodeBoolForKey("paused")
self.startTime = aDecoder.decodeObjectForKey("startTime") as NSDate
self.pauseTime = aDecoder.decodeObjectForKey("pauseTime") as NSDate
self.id …Run Code Online (Sandbox Code Playgroud) nscoding ×10
swift ×6
ios ×4
objective-c ×3
iphone ×2
cocoa-touch ×1
core-data ×1
mkpolyline ×1
nsarray ×1
nsobject ×1
optional ×1
saving-data ×1
subscript ×1
tuples ×1
uiimageview ×1
xcode ×1