У меня нетрудно архивировать Int, String, Bool и Date, но архивирование массива булевых массивов не работает, вот часть кода:Как сохранить [[Bool]] в Swift (Encode for archive array из булевых массивов)
class PlayerInfo: NSObject, NSCoding
{
public var score: Int = 0
public var lastPlayed: Date = Date()
public var visited: [[Bool]] = []
public var ringFound: Bool = false
init(dictionary: [String : AnyObject])
{
score = dictionary[ArchiveKeys.Score] as! Int
lastPlayed = dictionary[ArchiveKeys.LastPlayed] as! Date
visited = dictionary[ArchiveKeys.Visited] as! [[Bool]]
ringFound = dictionary[ArchiveKeys.RingFound] as! Bool
}
func encode(with archiver: NSCoder)
{
archiver.encode(score, forKey: ArchiveKeys.Score)
archiver.encode(lastPlayed, forKey: ArchiveKeys.LastPlayed)
archiver.encode(visited, forKey: ArchiveKeys.Visited)
archiver.encode(ringFound, forKey: ArchiveKeys.RingFound)
}
required init(coder unarchiver: NSCoder)
{
super.init()
score = unarchiver.decodeInteger(forKey: ArchiveKeys.Score)
lastPlayed = unarchiver.decodeObject(forKey: ArchiveKeys.LastPlayed) as! Date
visited = unarchiver.decodeObject(forKey: ArchiveKeys.Visited) as! [[Bool]]
ringFound = unarchiver.decodeBool(forKey: ArchiveKeys.RingFound)
}
class func retrieveCurrentGame() -> PlayerInfo!
{
let filePath: String = retrievePreviousGameFilePath(fileName: currentGameName)
if let game = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? PlayerInfo
{
print("retrieving previous game - found a game for previous day")
return game
}
else
{
print("retrieving previous game - can't find game data")
return nil
}
}
class func retrievePreviousGameFilePath(fileName: String) -> String
{
let kFileNameExtension: String = ".game"
let fileNameWithExtension: String = fileName + kFileNameExtension
let fileManager = FileManager.default
let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
print("url= " + (url.appendingPathComponent(fileNameWithExtension)?.path)!)
return (url.appendingPathComponent(fileNameWithExtension)?.path)!
}
public func saveCurrentGame()
{
let fileName: String = currentGameName + ".game"
let fileManager = FileManager.default
let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
print("url= " + (url.appendingPathComponent(fileName)?.path)!)
let filePath: String = (url.appendingPathComponent(fileName)?.path)!
NSKeyedArchiver.archiveRootObject(self, toFile: filePath)
}
}
Я не могу получить [[Bool]], посетив мой код. Есть ли лучший способ кодирования?
Followup ДЛЯ werm098:
я пересмотрел кодировку:
let visitedData: Data = NSKeyedArchiver.archivedData(withRootObject: visited)
archiver.encode(visitedData, forKey: ArchiveKeys.Visited)
// archiver.encode(visited, forKey: ArchiveKeys.Visited)
и декодирование:
let visitedData: Data = unarchiver.decodeObject(forKey: ArchiveKeys.Visited) as! Data
visited = NSKeyedUnarchiver.unarchiveObject(with: visitedData) as! [[Bool]]
// visited = unarchiver.decodeObject(forKey: ArchiveKeys.Visited) as! [[Bool]]
Но это все еще не работает?
Любые другие идеи?
Невозможно как? Что происходит вместо этого? Сообщение об ошибке и т. Д.? – Bill
Я поставил этот код на детскую площадку и смог воспроизвести такое же странное поведение. В настоящее время я не могу полностью исследовать проблему, но мое предложение состоит в том, чтобы сначала попытаться преобразовать объект в NSData, а затем сохранить данные и затем получить данные с помощью 'NSKeyedUnarchiver.unarchiveObjectWithData (data)' – werm098
Нет ошибки, просто нет данных. –