Я занимаюсь исследованием всего интерфейса, особенно переполнения стека, и моих собственных ссылок у меня дома, но я не смог выяснить, что не так с моим кодом. Я потратил большую часть своего времени, пытаясь понять эту проблему, и я надеюсь, что кто-то здесь поможет мне в правильном направлении.преобразование пользовательского объекта в NSData Swift
Установка:
У меня есть шахматы приложение, которое я здание в Swift 3.0, и структура выглядит следующим образом: BoardModel класс, который содержит все данные об игре, Кусок класс в доску модель, которая содержит данные о себе в BoardModel, Piece также имеет перечисление PieceType для .knight, .king и т. д.
BoardModel имеет двумерный массив Piece, представляющий шахматную доску. Теперь, с каждым ходом, я хочу сохранить игровые данные в Game Center, но прежде чем я даже попытаюсь сохранить данные игры, кодировка выдает ошибку, и именно там я. Ошибка просто указывает на AppDelegate с заявлением: "Thread: 1 signal SIGABRT"
.
Вот код, который является проблемой вместе с классом Кусок:
let pieceData = NSKeyedArchiver.archivedData(withRootObject: board.board[0][0]) // where the error is thrown
class Piece: NSObject, NSCoding {
var isSelected: Bool
var type: PieceType
var isWhite: Bool
var isFirstMove: Bool
var symbol: String!
var position: (row: Int, col: Int)!
override init() {
isSelected = false
type = PieceType.empty
isWhite = true
isFirstMove = true
}
required init(coder aDecoder: NSCoder) {
isSelected = aDecoder.decodeBool(forKey: "isSelected")
type = aDecoder.decodeObject(forKey: "type") as! BoardModel.PieceType
isWhite = aDecoder.decodeBool(forKey: "isWhite")
isFirstMove = aDecoder.decodeBool(forKey: "isFirstMove")
symbol = aDecoder.decodeObject(forKey: "symbol") as! String
position = aDecoder.decodeObject(forKey: "position") as! (Int, Int)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(isSelected, forKey: "isSelected")
aCoder.encode(type, forKey: "type")
aCoder.encode(isWhite, forKey: "isWhite")
aCoder.encode(isFirstMove, forKey: "isFirstMove")
aCoder.encode(symbol, forKey: "symbol")
aCoder.encode(position, forKey: "position")
}
init(isSelected: Bool, type: PieceType, isWhite: Bool, isFirstMove: Bool, symbol: String, position: (Int, Int)) {
self.isSelected = isSelected
self.type = type
self.isWhite = isWhite
self.isFirstMove = isFirstMove
self.symbol = symbol
self.position = position
}
func setPosition(to newPosition: (row: Int, col: Int)) {
position = newPosition
}
}
что PieceType? Объект Enum или Custom (NSObject)? –
@jigneshVadadoriya PieceType is enum –
Вы предоставили NSCoder для типа данных позиции? Попробуйте закомментировать позицию из вашего кода и посмотрите, не сработали ли вы все еще. Вероятно, вам нужно будет предоставить NSCoder для PieceType в зависимости от того, как вы его реализовали. – jvarela