我正在使用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)
答案 0 :(得分:0)
您必须已经创建了一个pinCode对象(或多个)。 “ Optional(4)并不意味着您已经创建了4个引脚。您要计算的是String。这意味着您检索的对象具有4位数字的引脚。如果您还没有创建任何pinCode对象,则应该为nil。或者您在未分配引脚的情况下创建了一个,则应该为0。
我建议您查看领域文件。您应该可以通过以下方式打印其位置:
print(Realm.Configuration.defaultConfiguration.fileURL!)
然后,您可以使用Realm Studio打开文件并验证其中的内容。
答案 1 :(得分:0)
您正在执行以下操作:
尽管这实际上不在问题的范围内,但这里是对未来的提示。根据{{3}},您的类型名称应大写(遵循CamelCase标准)。因此,您的pinCodes
和manager
类以及pinCodeManager
协议应分别称为PinCode
,Manager
和PinCodeManager
。
假设您已重命名类型,并且正如其他用户所指出的那样,您没有计算PinCode
的实例。您正在计算pin
类的PinCode
成员的长度。重构您的checkForExistingPin()
函数:
func checkForExistingPin() -> Bool {
return realm.objects(pinCode.self).count > 0
}
enterNewPin(newPin:)
函数中,如果您已经存储了PinCode
对象,请注意,您实际上是在更新旧的PinCode
并添加具有相同{{ 1}}。例如,如果您以前有一个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)
}
}
}
来获取Realm,但可能与您的配置有关,但是您可能在某个地方覆盖了try! Realm()
其他)。希望有帮助!