【问题标题】:Is it possible to use enums in RealmSwift?是否可以在 RealmSwift 中使用枚举?
【发布时间】:2016-08-31 05:48:08
【问题描述】:

我想做这样的事情:

enum WeekDay {
    case Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

class Person: Object {

    dynamic var birthday: WeekDay? = .Monday
    dynamic var id: String? = nil
    dynamic var birthdayRaw: String? = nil

    override static func primaryKey() -> String? {
        return "id"
    }
}

但是,我收到一个错误:

属性不能标记为动态,因为它的类型不能 用Objective-C表示

我该如何解决这个问题?感谢您的帮助。

【问题讨论】:

    标签: ios swift enums realm


    【解决方案1】:

    Realm 没有直接的方法。 Github issue.

    但是你可以考虑这个技巧

    enum WeekDay: String {
        case Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
    }
    
    class Person: Object {
        private var _day: WeekDay?
        var birthday: WeekDay? {
            get {
                if let resolTypeRaw = birthdayRaw  {
                    _day = WeekDay(rawValue: resolTypeRaw)
                    return _day
                }
                return .Sunday
            }
            set {
                birthdayRaw = newValue?.rawValue
                _day = newValue
            }
        }
    
        dynamic var id: String? = nil
        dynamic var birthdayRaw: String? = nil
    
        override static func primaryKey() -> String? {
            return "id"
        }
    }
    

    【讨论】:

    • 或者如果它是Int枚举,你可以用@objc标记枚举类型定义。
    • 此外,您将无法在查询中使用birthDay,这会造成混淆。您必须使用_day 进行查询。
    【解决方案2】:

    从 Realm 3.x 开始,您可以使用基于 Int 的枚举(显然,有副作用)。

    从 Realm 4.1 开始,您可以通过遵守“RealmEnum”协议来使用任何 RawRepresentable 枚举(Int、Float、String)。 Details in the pull request

    【讨论】:

      【解决方案3】:

      我已经创建了一个扩展程序,希望对您有所帮助

      import RealmSwift
      
      protocol RealmPersistableEnum: RawRepresentable, _OptionalPersistable { }
      
      extension RealmPersistableEnum where RawValue: _OptionalPersistable {
          static func _rlmGetProperty(_ obj: ObjectBase, _ key: PropertyKey) -> Self {
              Self(rawValue: RawValue._rlmGetProperty(obj, key)) ?? Self()
          }
      
          static func _rlmGetPropertyOptional(_ obj: ObjectBase, _ key: PropertyKey) -> Self? {
              guard let value = RawValue._rlmGetPropertyOptional(obj, key) else { return nil }
              return Self(rawValue: value)
          }
          
          static func _rlmSetProperty(_ obj: ObjectBase, _ key: PropertyKey, _ value: Self) {
              RawValue._rlmSetProperty(obj, key, value.rawValue)
          }
      }
      

      使用示例

      enum SomeEnumInt: Int, RealmPersistableEnum {
          case none = 0
          case test = 1
          case debug = 2
      
          init() {
              self = .none
          }
      }
      
      enum SomeEnumString: String, RealmPersistableEnum {
          case none
          case test
          case debug
      
          init() {
              self = .none
          }
      }
      
      class Foo: Object {
          @Persisted var v1: String
          @Persisted var v2: SomeEnumInt
          @Persisted var v3: SomeEnumString
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-16
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        相关资源
        最近更新 更多