【问题标题】:Cannot convert value of type 'String?' to expected argument type 'Int64' swift ios无法转换“字符串”类型的值?到预期的参数类型'Int64' swift ios
【发布时间】:2018-04-02 06:21:12
【问题描述】:

是什么导致了ff中的错误。行以及如何解决 itreward: (rewardField?.text) 是说不能转换“字符串”类型的值?到预期的参数类型 'Int64' swift ios 。顺便说一句,代码 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()
}

【问题讨论】:

  • 尝试像 (rewardField?.text) 一样解开rewardField.text!
  • 在你的方法 saveDataInCoreData() 中,reward 的数据类型看起来是 Int64,而不是 String。
  • 我试过拆开它
  • 是的,正是它的 int 64
  • 文本字段中的文本是字符串,即使字符串是数字。

标签: ios swift


【解决方案1】:

安全的方法是使用guard来检查文本是否为nil并且可以转换为数字。

guard let value = rewardField?.text, let reward = Int64(value) else {
    /// Not valid
    return
}
print(reward)

如果rewardField?.text = xyz(任何非数值)则无效。

编辑评论

在从数组中获取元素之前始终检查数组计数。在这里,当您从 0th 索引获取时,您可以使用 first 获取第一个对象。

if let rewardField = alert?.textFields.first {
   /// Use this rewardField here
   print(rewardField.text)
}

如果数组不包含任何textField,您的应用可能会崩溃,但通过上述方式不会。

【讨论】:

  • 这是我的最新版本,.. let rewardField = alert?.textFields![0]。进而。 self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: Int(rewardField!.text))....你能检查一下并整合到你的
  • @DurnKurvirck 编辑了答案
【解决方案2】:
//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)

【讨论】:

  • 顺便说一句,先生,我想问您如何将日期选择器附加到警报文本字段。就像我会从日期选择器中选择日期,它的值将在选择后反映到警报文本字段。
  • 你的回答中的感叹号太他妈高了!
  • 答案解决了 OP 的原始问题。 “无法转换'String'类型的值?'到预期的参数类型'Int64' swift ios”显然我们应该避免在我们不确定值是否存在时强制展开(感叹号)
  • @DurnKurvirck。警报中的文本字段与普通文本字段没有什么不同。请参阅此视频以设置带有文本字段的日期选择器(swift 4 xcode 9)youtube.com/watch?v=QBuYmP2p3AY
【解决方案3】:

冲突是 ... 在函数参数列表中 rewardInt64 类型,但您的参数 rewardField?.textString? 类型。

现在,您只需将 rewardField?.text 转换/转换为 64 位整数值。

【讨论】:

    【解决方案4】:

    您正在发送需要传递 Int 值的字符串。您通过 "rewardField?.text"

    获得 String

    你需要把它转换成Int

    您可以使用

    将字符串值更改为 Int64

    Int(rewardField!.text)!

    如果你编译你的 64 位应用程序,那么你的 Int 将是 64 位的。

    注意:您必须验证您的文本文件以仅允许 Int 值,否则您可能会因不需要的值而崩溃。

    【讨论】:

    • String 转换为Int 不是类型转换 并且显式Int64 是必要的,因为Core Data 不支持常规Int
    • 如何让警报文本字段只接受整数输入?
    • @vadian ,因为我正在使用警报
    • @DurnKurvirck - 将键盘类型更改为数字键盘
    • 我的意思是以编程方式,使警报文本字段只允许整数输入
    【解决方案5】:

    函数 saveDataInCoreData 的最后一个参数是 Int64 类型。 请更改:

    self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: (rewardField?.text))
    

    收件人:

    self.saveDataInCoreData(nameOfGroccery: (textField?.text)! , detail: (detailField?.text)! , reward: Int64((rewardField?.text)!)!)
    

    但是,不要使用强制解包,当你用字符串值初始化构造函数 Int64 时,将其移动到 if letguard 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)
    }
    

    【讨论】:

    • 关于您的建议,这是结果 -------> 线程 1:致命错误:在展开可选值时意外发现 nil
    • 是的,因为您应该将 Int(string) 移动到 if let 块。
    • 您可以在上面定义它作为示例吗? @安德鲁
    • 更新答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2019-12-24
    • 2017-12-30
    • 2017-04-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多