Ios 无法将“字符串”类型的值转换为预期的参数类型“Int64”
是什么导致ff中出现错误。行以及如何解析iTeward:rewardField?。文本表示无法将“String”类型的值转换为预期的参数类型“Int64”。顺便说一句,代码db中奖励的实体类型是int64 谢谢Ios 无法将“字符串”类型的值转换为预期的参数类型“Int64”,ios,swift,Ios,Swift,是什么导致ff中出现错误。行以及如何解析iTeward:rewardField?。文本表示无法将“String”类型的值转换为预期的参数类型“Int64”。顺便说一句,代码db中奖励的实体类型是int64 谢谢 self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: (rewardField?.text)) func saveDataInCore
self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: (rewardField?.text))
func saveDataInCoreData(nameOfGroccery:String , detail: String , reward: Int64){
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let groceryData = GroceryItem(context: context) // Link GroceryItem & Context
groceryData.name = nameOfGroccery
groceryData.detail = detail
groceryData.reward = reward
groceryData.isSelected = false
groceryData.houseNo = loggedInUserHouseNumber
// print("data:", groceryItem.name)
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
函数saveDataInCoreData中的最后一个参数的类型为Int64。 请更改:
self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: (rewardField?.text))
致:
但是,不要使用强制展开,当使用字符串值初始化构造函数Int64时,将其移动到if-let或guard-let语句
例如:
var grocceryTextField: UITextField?
var detailTextField: UITextField?
var rewardTextField: UITextField?
grocceryTextField = UITextField()
grocceryTextField?.text = "a"
detailTextField = UITextField()
detailTextField?.text = "a"
rewardTextField = UITextField()
rewardTextField?.text = "213"
func saveDataInCoreData(nameOfGroccery: String, detail: String, reward: Int) {
// ...
print(reward)
}
if let grocceryName = grocceryTextField?.text,
let detail = detailTextField?.text,
let reward = rewardTextField?.text,
let rewardRepresentation = Int(reward) {
saveDataInCoreData(nameOfGroccery: grocceryName, detail: detail, reward: rewardRepresentation)
}
您正在发送需要传递Int值的字符串。您正在使用rewardField?获取字符串值。text 您需要将其转换为Int 您可以使用键入将字符串值更改为Int64 因特沃德菲尔德!。短信 如果编译64位应用程序,则Int本身将是64位的
注意:您必须验证您的textfield以仅允许Int值,否则您可能会因不需要的值而崩溃。冲突是。。。函数参数列表中的reward是Int64类型,但您的参数rewardField?。文本是字符串吗?类型 现在,您只需将/cast rewardField?.text转换为64位整数值。安全的方法是使用guard检查文本是否为零,并将其转换为数字
guard let value = rewardField?.text, let reward = Int64(value) else {
/// Not valid
return
}
print(reward)
如果rewardField?.text=xyz为任何非数字值,则无效
编辑以供评论
从数组中提取元素之前,请始终检查数组计数。在这里,当您从第0个索引获取时,可以使用first来获取第一个对象
if let rewardField = alert?.textFields.first {
/// Use this rewardField here
print(rewardField.text)
}
如果数组不包含任何文本字段,则您的应用程序可能会崩溃,但通过上述方式不会崩溃。尝试展开rewardField。文本类似rewardField?.text!在您的方法saveDataInCoreData中,奖励的数据类型似乎是Int64,不是字符串。我尝试过将其展开是的,确切地说是int 64文本字段中的文本是字符串,即使字符串是数字。将字符串转换为int不是类型转换,显式int 64是必要的,因为核心数据不支持常规int。如何允许警报文本字段仅接受整数输入?@vadian,因为我正在使用alerts@DurnKurvirck-以编程方式将键盘类型更改为numberpadi mean,使警报文本字段仅允许整数输入根据您的建议这是结果---->Thread 1:致命错误:在展开可选值时意外发现零是,因为你应该把Intstring移到if let block。你能把它定义为一个例子吗,先生@这是我的最新版本。。让rewardField=alert?.textFields![0]. 然后。self.savedataincoredatanameofcroccery:textField?.text,详细信息:detailField?.text,奖励:IntrewardField!。文本…您可以检查并集成到吗yours@DurnKurvirck编辑答案先生,我想问你如何将日期选择器附加到警报文本字段。就像我将从日期选择器中选择日期一样,选择后该值将反映到警报文本字段中。您的答案中感叹号的数量太高了!答案回答了OP的原始问题。无法将“String”类型的值转换为预期的参数类型“Int64”。显然,我们应该避免在不确定值是否存在的情况下强制展开感叹号NOT@DurnKurvirck. 警报中的文本字段与原始文本字段没有区别。请参阅本视频,设置带有文本字段swift 4 xcode 9的日期选择器
//if rewardField has some text and if it can be converted to Int64
guard let value = rewardField?.text, let rewardInt = Int64(value) else {
/// either no value in rewardField, or value is not Int
return
}
//OK to proceed now, Call your function
self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: rewardInt)
//if rewardField has some text and if it can be converted to Int64
guard let value = rewardField?.text, let rewardInt = Int64(value) else {
/// either no value in rewardField, or value is not Int
return
}
//OK to proceed now, Call your function
self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: rewardInt)