簡體   English   中英

iOS(Swift):編碼/解碼枚舉

[英]iOS (Swift): Encoding/Decoding Enums

我有一些NSObject子類,在下面定義了一個可表示字符串的Enum

class SomeClass: NSObject {

    enum Direction: String {
        case north = "North"
        case south = "South"
    }

    public var direction: Direction

    init(direction: Direction) {
        self.direction = direction
        super.init()
    }

}

我想允許對此類進行編碼和解碼,因此我使用以下方法:

func encode(with aCoder: NSCoder) {
    aCoder.encode(direction, forKey: #keyPath(direction))
}

public convenience required init?(coder aDecoder: NSCoder) {
    self.init(direction: aDecoder.decodeObject(forKey: #keyPath(direction)) as! Direction)
}

但是,出現以下錯誤“ #keyPath”的參數是指非“ @objc”屬性的“ direction”,並且當我將direction的定義更改為

@objc public var direction: Direction

我收到以下錯誤消息: Property不能標記為@objc,因為它的類型不能在Objective-C中表示

請避免這種錯誤的最佳方法是什么?

謝謝你的幫助。

編輯

注釋說明了問題。 此鏈接中的此答案建議如何完成使用String Raw可表示的對象。

如何在Objective-C中使Swift String枚舉可用?

您可以利用基於String的枚舉(不僅是)具有的rawValue支持:

func encode(with aCoder: NSCoder) {
    aCoder.encode(direction.rawValue, forKey: "direction")
}

public convenience required init?(coder aDecoder: NSCoder) {
    guard let direction = Direction(rawValue: aDecoder.decodeObject(forKey: "direction") else {
        // direction was not encoded, we assume an encoding error
        return nil
    }
    self.init(direction: direction)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM