RealmSwift:如何在 UInt 上正确采用 RealmOptionalType 协议?

RealmSwift: How to properly Adopt to RealmOptionalType protocol on UInt?

我有一个对象,其来自服务器的属性之一要求类型为 UInt,我的项目使用 RealmSwift 在从服务器解析数据后在本地存储数据。

这是示例用例:

import RealmSwift
import Foundation 

class MediaServerInfo: Object {
private var _hostPort = RealmOptional<UInt>()

}

// MARK: - Adopting to RealmOptionalType

// Here I am trying to adopt the protocol so that the _hostPort above can use RealmOptional<UInt>()

extension UInt: RealmOptionalType {
  public static func className() -> String {
    return "UInt"
  }
}

但是,当我进入使用上述 class 的页面时,我立即收到以下 运行 时间错误:-

 Terminating app due to uncaught exception 'RLMException', reason: ''RealmOptional<UInt>' is not a valid RealmOptional type.'

对此有什么想法吗?

Realm 不支持 UInt 类型。 Realm Cheatsheet 显示支持的类型以及文档中的这个

RealmOptional supports Int, Float, Double, Bool, and all of the sized versions of Int (Int8, Int16, Int32, Int64).

一种技术是将 Int 值存储在 Realm 中作为后备变量,并利用非托管变量作为前变量。

class MediaServerInfo: Object {
   private let _hostPort = RealmOptional<Int>()

   var hostPort: UInt {
      get {
         let myInt = _hostPort.value ?? 0
         let u = UInt(myInt)
         return u
      }
    
     set {
        let myInt = Int(newValue)
        _hostPort.value = myInt
     }
   }
}

然后在创建的时候这样使用

let info = MediaServerInfo()
info.hostPort = UInt(42)

或阅读

let x = info.hostPort