You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift初始化CryptListStruct报错Cannot convert String to Double问题求助

问题原因
  • 核心逻辑错误:你当前将搜索框输入的同一个字符串强行赋值给CryptListStruct的所有属性,完全忽略了不同属性的业务含义和类型要求。比如用户输入的是加密货币名称「BTC」,字符串「BTC」本身就不可能转换为Int、Double类型的数值,必然转换失败。
  • 类型转换写法错误:你使用了强制解包!,只要字符串无法转换为对应数值类型,就会直接崩溃,你看到的报错就是转换失败触发的类型不匹配提示。
正确处理方案

首先你要明确CryptListStruct是定义为Decodable的模型,设计初衷是用来解析服务端返回的接口数据,不是用来手动构造请求参数的。如果你的需求是用户输入搜索关键词后请求加密货币列表接口,你只需要把搜索关键词作为接口的查询参数传递即可,不需要手动初始化整个CryptListStruct。

如果你确实有场景需要手动将字符串转换为数值类型给结构体赋值,请使用可选绑定替代强制解包,避免崩溃,示例写法如下:

extension CryptListTableViewController: UISearchBarDelegate{
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        // 先收起键盘
        searchBar.resignFirstResponder()
        guard let searchText = searchBar.text, !searchText.isEmpty else { return }
        
        // 注意:只有当你的搜索内容本身就是数字时,数值类型转换才会成功
        guard let typeIsCrypto = Int(searchText),
              let dataSymbolsCount = Int(searchText),
              let volume1HrsUsd = Double(searchText),
              let volume1DayUsd = Double(searchText),
              let volume1MthUsd = Double(searchText) else {
            // 转换失败时给用户提示
            let alert = UIAlertController(title: "输入无效", message: "请输入合法的数字内容", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default))
            present(alert, animated: true)
            return
        }
        
        let cryptRequest = CryptListStruct(
            assetID: searchText,
            name: searchText,
            typeIsCrypto: typeIsCrypto,
            dataQuoteStart: searchText,
            dataQuoteEnd: searchText,
            dataOrderbookStart: searchText,
            dataOrderbookEnd: searchText,
            dataTradeStart: searchText,
            dataTradeEnd: searchText,
            dataSymbolsCount: dataSymbolsCount,
            volume1HrsUsd: volume1HrsUsd,
            volume1DayUsd: volume1DayUsd,
            volume1MthUsd: volume1MthUsd,
            priceUsd: Double(searchText),
            idIcon: searchText,
            dataStart: searchText,
            dataEnd: searchText
        )
        // 后续处理你的cryptRequest
    }
}
常规搜索场景推荐写法

绝大多数情况下你不需要手动构造这个结构体,正确的搜索逻辑应该是:

  1. 拿到用户输入的搜索关键词,拼接到接口请求的参数中
  2. 请求接口拿到返回的JSON数据
  3. 用JSONDecoder直接把JSON解析为CryptListStruct实例,不需要你手动处理每个属性的赋值和类型转换。

内容的提问来源于stack exchange,提问作者Nurjan Ababakirov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:54:02