程序启动时,现有对象的RealmSwift数量始终为4

时间:2019-03-08 19:59:23

标签: swift realm

我正在使用RealmSwift为应用创建PIN码屏幕。我有一个具有一些功能的管理器类,包括checkForExistingPin(),该类用于检查引脚是否存在(顾名思义)。

当我创建经理类的实例并调用checkForExistingPin()函数时,即使我尚未创建图钉,它始终告诉我有4个(打印:“ Optional(4)”)。

任何人都可以解释为什么这样做,以及如何从代码中获得正确的输出吗?

这是课程:

import Foundation
import RealmSwift

class pinCode: Object   {
    @objc dynamic var pin = ""
}

protocol pinCodeManager {
    func checkForExistingPin() -> Bool
    func enterNewPin(newPin:String)
    func checkPin(pin:String) -> Bool
}

class manager:pinCodeManager    {
let realm = try! Realm()

func checkForExistingPin() -> Bool {

    let existingCode = realm.objects(pinCode.self).first?.pin
    print("\n\nNumber of existing PINs: ",  existingCode?.count as Any, "\n\n") // Number of existing PINs:  Optional(4)
    if existingCode?.count == 0  {

        return false
    }
    else {
        return true
    }
}

func enterNewPin(newPin:String) {
    if checkForExistingPin()    {
        let oldCode = realm.objects(pinCode.self).first
        try! realm.write {
            oldCode!.pin = newPin
        }
    }
    let newPinObject = pinCode()
    newPinObject.pin = newPin
    realm.add(newPinObject)
}

func checkPin(pin:String) -> Bool   {
    if checkForExistingPin()    {
        print ("Realm object first: ", realm.objects(pinCode.self).first?.pin as Any)
        if pin == realm.objects(pinCode.self).first?.pin    {
            print ("Pin Correct")
            return true
        }
        else    {
            print ("Pin Incorrect")
            return false
        }
    }
    print ("No existing pin")
    return false
    }   
}

这是ViewController的相关代码段:

class InitialViewController: UIViewController {
    let myPin = pinCode()
    let myManager = manager()
    let realm = try! Realm()

    @IBAction func NewUserButton(_ sender: Any) {
    print("No  existing PINs: ", self.myManager.checkForExistingPin())
    }

输出为:现有PIN数:可选(4)

2 个答案:

答案 0 :(得分:0)

您必须已经创建了一个pinCode对象(或多个)。 “ Optional(4)并不意味着您已经创建了4个引脚。您要计算的是String。这意味着您检索的对象具有4位数字的引脚。如果您还没有创建任何pinCode对象,则应该为nil。或者您在未分配引脚的情况下创建了一个,则应该为0。

我建议您查看领域文件。您应该可以通过以下方式打印其位置: print(Realm.Configuration.defaultConfiguration.fileURL!) 然后,您可以使用Realm Studio打开文件并验证其中的内容。

答案 1 :(得分:0)

您正在执行以下操作:

  1. 尽管这实际上不在问题的范围内,但这里是对未来的提示。根据{{​​3}},您的类型名称应大写(遵循CamelCase标准)。因此,您的pinCodesmanager类以及pinCodeManager协议应分别称为PinCodeManagerPinCodeManager

  2. 假设您已重命名类型,并且正如其他用户所指出的那样,您没有计算PinCode的实例。您正在计算pin类的PinCode成员的长度。重构您的checkForExistingPin()函数:

func checkForExistingPin() -> Bool {
    return realm.objects(pinCode.self).count > 0
}
  1. enterNewPin(newPin:)函数中,如果您已经存储了PinCode对象,请注意,您实际上是在更新旧的PinCode并添加具有相同{{ 1}}。例如,如果您以前有一个pin对象与PinCode存储在一起。调用pin=1234之后,您将在enterNewPin(newPin: "5678")中存储两个这样的对象。您可能还希望重构它:
pin=5678
  1. 在尝试在应用中进行任何调试之前。我建议您先卸载然后在运行位置(模拟器或实际设备)重新安装该应用程序。如果情况仍然很奇怪,那么如果您要覆盖默认配置(例如,我注意到您刚刚使用func enterNewPin(newPin:String) { if checkForExistingPin() { let oldCode = realm.objects(pinCode.self).first try! realm.write { oldCode!.pin = newPin } } else { let newPinObject = pinCode() newPinObject.pin = newPin try! realm.write { realm.add(newPinObject) } } } 来获取Realm,但可能与您的配置有关,但是您可能在某个地方覆盖了try! Realm()其他)。

希望有帮助!