2016-12-06 3 views
1

Я занимаюсь исследованием всего интерфейса, особенно переполнения стека, и моих собственных ссылок у меня дома, но я не смог выяснить, что не так с моим кодом. Я потратил большую часть своего времени, пытаясь понять эту проблему, и я надеюсь, что кто-то здесь поможет мне в правильном направлении.преобразование пользовательского объекта в 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 
    } 
} 
+0

что PieceType? Объект Enum или Custom (NSObject)? –

+0

@jigneshVadadoriya PieceType is enum –

+0

Вы предоставили NSCoder для типа данных позиции? Попробуйте закомментировать позицию из вашего кода и посмотрите, не сработали ли вы все еще. Вероятно, вам нужно будет предоставить NSCoder для PieceType в зависимости от того, как вы его реализовали. – jvarela

ответ

1

если ваш Enum подобен этому PieceType и тип Int

enum PieceType : Int { 
    case empty 
    case notEmpty 

} 

Затем написать encode и decode метод как таким образом

required init(coder aDecoder: NSCoder) { 
     isSelected = aDecoder.decodeBool(forKey: "isSelected") 
     type = PieceType(rawValue: aDecoder.decodeObject(forKey: "type") as! Int)! 
     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.rawValue, forKey: "type") 
     aCoder.encode(isWhite, forKey: "isWhite") 
     aCoder.encode(isFirstMove, forKey: "isFirstMove") 
     aCoder.encode(symbol, forKey: "symbol") 
     aCoder.encode(position.row, forKey: "position.row") 
     aCoder.encode(position.col, forKey: "position.col") 
    } 

я имею проверку сильфон кода и произведение

let pice = Piece(isSelected: true, type: .empty, isWhite: true, isFirstMove: true, symbol: "Test", position: (2, 10)) 
let pieceData = NSKeyedArchiver.archivedData(withRootObject:pice) 
print(pieceData) 

And Out путы

386 bytes 
+0

Это работает только с пустыми фигурами, которые вы создали в своем примере. Он не будет работать с ----------------------- let somePiece = BoardModel.Piece (isSelected: false, type: BoardModel.PieceType.knight, isWhite: true, isFirstMove: true, symbol: «Wknight», position: (0, 1)) –

+0

Я удалил экземпляр позиции, и это сработало, но мне нужна позиция, поэтому мне нужно выяснить, что делать. @jvarela, прокомментировал мой вопрос и сказал, чтобы предоставить NSCoder для позиции, но я не уверен, как это сделать. jignesh, есть ли у вас какие-либо представления о том, как лучше всего это сделать? –

+0

Позвольте мне попробовать по другому пути –