2016-06-01 4 views
2

私はスウィフトの素晴らしい表現力に巻き込まいます、そしてこのようなケースごとに関連する値、と列挙型を使用するつもりだった。しかし関連する値を持つスウィフト列挙型を(優雅に)維持する方法 - またはそれらを避ける必要がありますか?

enum PlayerStatus { 
    case Playing (league: Int, position: Int) 
    case NotPlaying (ReasonNotPlaying, LastPlayed) 
} 

enum ReasonNotPlaying { 
    case Injured 
    case Away 
    case DidntPlay 
    case Left 
} 

struct LastPlayed { 
    let year: Int 
    let position: Int 
} 

class Player { 

    var firstName: String = "" 
    var surname: String = "" 
    // etc 

    var status: PlayerStatus? = nil 
} 

、私が含まれているプレイヤーのクラスを永続化する必要があります列挙型であり、RealmもCoreDataもこれを行うための単純なメカニズムを持っていません - Objective-C(またはRealmの場合、Androidの場合は、関連付けられた値を持つ列挙型が使用できないためかもしれません)

enumsを誤解しましたか?私の例はおそらく明確ではないでしょうか?または、どのようにenumを簡潔に持続させることができますか?

提案がありますか?

答えて

1

あなたはそうです。現在、レルムはEnumの格納をサポートしていません。したがって、関連付けられた値を持つ列挙型を簡単に格納する方法はありません。

私が提案回避策は、次のようなものです:

プロパティに列挙値を抽出します。その後、enumのsetter/getterをオーバーライドして、enum値をset/getごとにプロパティに変換します。それは複雑すぎるようですが、使用法は非常に簡単です、ちょうど設定/ statusプロパティを通常通り取得します。

enum PlayerStatus { 
    case Playing (league: Int, position: Int) 
    case NotPlaying (ReasonNotPlaying, LastPlayed) 
} 

enum ReasonNotPlaying: String { 
    case Injured 
    case Away 
    case DidntPlay 
    case Left 
} 

struct LastPlayed { 
    let year: Int 
    let position: Int 
} 

class Player: Object { 
    dynamic var firstName: String = "" 
    dynamic var surname: String = "" 
    // etc 

    private let playingLeague = RealmOptional<Int>() 
    private let playingPosition = RealmOptional<Int>() 

    private dynamic var reasonNotPlaying: String? = nil 

    private let lastPlayedYear = RealmOptional<Int>() 
    private let lastPlayedPosition = RealmOptional<Int>() 

    var status: PlayerStatus? { 
     get { 
      if let league = playingLeague.value, 
       let position = playingPosition.value { 
       return PlayerStatus.Playing(league: league, position: position) 
      } else if let year = lastPlayedYear.value, 
       let position = lastPlayedPosition.value, 
       let reason = reasonNotPlaying { 
       return PlayerStatus.NotPlaying(ReasonNotPlaying(rawValue: reason)!, 
               LastPlayed(year: year, position: position)) 
      } 
      return nil 
     } 
     set { 
      if let newValue = newValue { 
       switch newValue { 
       case let .Playing(league, position): 
        playingLeague.value = league 
        playingPosition.value = position 

        reasonNotPlaying = nil 
        lastPlayedYear.value = nil 
        lastPlayedPosition.value = nil 
       case let .NotPlaying(reason, lastPlayed): 
        playingLeague.value = nil 
        playingPosition.value = nil 

        reasonNotPlaying = reason.rawValue 
        lastPlayedYear.value = lastPlayed.year 
        lastPlayedPosition.value = lastPlayed.position 
       } 
      } else { 
       playingLeague.value = nil 
       playingPosition.value = nil 

       reasonNotPlaying = nil 
       lastPlayedYear.value = nil 
       lastPlayedPosition.value = nil 
      } 
     } 
    } 

    override static func ignoredProperties() -> [String] { 
     return ["status"] 
    } 
} 
関連する問題