RealmSwift номер существующего объекта всегда 4, при запуске программы - PullRequest
0 голосов
/ 08 марта 2019

Я использую RealmSwift, чтобы создать экран PIN-кода для приложения. У меня есть класс менеджера, который имеет несколько функций, включая checkForExistingPin (), который предназначен для проверки наличия пин-кода (как следует из названия).

Когда я создаю экземпляр класса manager и вызываю функцию 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 голосов
/ 10 марта 2019

У вас здесь происходит несколько вещей:

  1. Хотя это на самом деле не входит в суть вопроса, вот совет на будущее. Названия ваших типов должны быть написаны заглавными буквами (в соответствии со стандартом CamelCase) согласно Руководству по проектированию Swift API . Таким образом, ваши классы pinCodes и manager и протокол pinCodeManager должны называться PinCode, Manager и PinCodeManager соответственно.

  2. Если вы переименовали свои типы и, как указали другие пользователи, вы не учитываете случаи PinCode. Вы рассчитываете длину pin члена PinCode класса. Рефакторинг вашей checkForExistingPin() функции:

func checkForExistingPin() -> Bool {
    return realm.objects(pinCode.self).count > 0
}
  1. В вашей функции enterNewPin(newPin:), если у вас уже есть сохраненный объект PinCode, обратите внимание, что вы фактически обновляете старый PinCode и добавляете новый с тем же pin. Например, если у вас ранее был объект PinCode, сохраненный с pin=1234. После вызова enterNewPin(newPin: "5678") у вас будет два таких объекта, сохраненных с pin=5678. Возможно, вы также захотите рефакторинг:
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)
        }
    }
}
  1. Перед попыткой отладки в вашем приложении. Я рекомендую сначала удалить, а затем переустановить приложение, где бы вы ни работали (симулятор или реальное устройство). Если вещи продолжают вести себя странно, это, вероятно, связано с вашей конфигурацией, если вы переопределяете конфигурацию по умолчанию (т.е. я заметил, что вы просто использовали try! Realm() для извлечения области, но вы могли переопределить Realm.Configuration.defaultConfiguration где-то еще).

Надеюсь, это поможет!

0 голосов
/ 09 марта 2019

Вы, должно быть, создали объект pinCode (или несколько из них).«Необязательно (4) не означает, что вы создали 4 булавки. Вы считаете String. Это означает, что у полученного вами объекта есть 4-значный пин-код. Если вы не создали ни одного объекта pinCode, вы должны получить ноль. Или еслиВы создали его, не назначая пин-код, вы должны получить 0.

Я рекомендую просмотреть файл области. Вы сможете распечатать его местоположение следующим образом: print(Realm.Configuration.defaultConfiguration.fileURL!) Затем вы можете открыть файлс Realm Studio и проверьте, что там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...