Ios 无法将“字符串”类型的值转换为预期的参数类型“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

是什么导致ff中出现错误。行以及如何解析iTeward:rewardField?。文本表示无法将“String”类型的值转换为预期的参数类型“Int64”。顺便说一句,代码db中奖励的实体类型是int64

谢谢

  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)