折腾:
[已解决]swift中enum枚举变量没法被aCoder.encodeObject
期间,用代码:
self.personType = aDecoder.decodeObjectForKey(codingKey_personType) as! PersonType  | 
出错:

EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode = 0x0)
相关部分代码为:
class PersonItem: ContactItem {     var personType:PersonType     var phoneNumber:String     var email:String     var position:String     override init() {         personType = PersonType.Invalid         phoneNumber = ""         email = ""         position = ""         super.init()         commonInit()     }     // MARK: NSCoding     private let codingKey_personType = "PersonItem_personType"     private let codingKey_phoneNumber = "PersonItem_phoneNumber"     private let codingKey_email = "PersonItem_email"     private let codingKey_position = "PersonItem_position"     required init?(coder aDecoder: NSCoder){         self.personType = aDecoder.decodeObjectForKey(codingKey_personType) as! PersonType         self.phoneNumber = aDecoder.decodeObjectForKey(codingKey_phoneNumber) as! String         self.email = aDecoder.decodeObjectForKey(codingKey_email) as! String         self.position = aDecoder.decodeObjectForKey(codingKey_position) as! String         super.init(coder: aDecoder)         commonInit()     }     override func encodeWithCoder(aCoder: NSCoder){         super.encodeWithCoder(aCoder)         aCoder.encodeObject(personType.rawValue, forKey: codingKey_personType)         aCoder.encodeObject(phoneNumber, forKey: codingKey_phoneNumber)         aCoder.encodeObject(email, forKey: codingKey_email)         aCoder.encodeObject(position, forKey: codingKey_position)     }     func commonInit(){         self.type = ContactType.Person     } }  | 
搜:
swift enum decodeObjectForKey fail
ios – EXC_BAD_INSTRUCTION in NSCoding of Swift – Stack Overflow
swift enum decodeObjectForKey EXC_BAD
archive array of optional structs with NSCoding in Swift? – Stack Overflow
EXC_BAD_INSTRUCTION in NSCoding of Swift
EXC_BAD_INSTRUCTION when unarchiving Swift Dictionary – btday.com
swift unarchive enum EXC_BAD
ios unarchive enum EXC_BAD
搜:
swift enum archive
Swift enum and NSCoding – Stack Overflow
How do I encode enum using NSCoder in swift? – Stack Overflow
【总结】
后来改为:
//        self.personType = aDecoder.decodeObjectForKey(codingKey_personType) as! PersonType         let rawPersonTypeStr = aDecoder.decodeObjectForKey(codingKey_personType) as! String //"Colleague"         self.personType = PersonType(rawValue: rawPersonTypeStr)! //JianDao.PersonType.Colleague  | 
即可。
完整代码:
enum PersonType:String {     case Invalid     case Friend     case Colleague     case Bot     case Myself } class PersonItem: ContactItem {     var personType:PersonType     override init() {         personType = PersonType.Invalid          super.init()     }     // MARK: NSCoding     private let codingKey_personType = "PersonItem_personType"     required init?(coder aDecoder: NSCoder){ //        self.personType = aDecoder.decodeObjectForKey(codingKey_personType) as! PersonType //        let rawPersonTypeStr = aDecoder.decodeObjectForKey(codingKey_personType) as! String //"Colleague" //        self.personType = PersonType(rawValue: rawPersonTypeStr)! //JianDao.PersonType.Colleague         self.personType = PersonType(rawValue: aDecoder.decodeObjectForKey(codingKey_personType) as! String)!         super.init(coder: aDecoder)     }     override func encodeWithCoder(aCoder: NSCoder){         aCoder.encodeObject(personType.rawValue, forKey: codingKey_personType)         super.encodeWithCoder(aCoder)     } }  | 
供参考。