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 } }
常规搜索场景推荐写法
绝大多数情况下你不需要手动构造这个结构体,正确的搜索逻辑应该是:
- 拿到用户输入的搜索关键词,拼接到接口请求的参数中
- 请求接口拿到返回的JSON数据
- 用
JSONDecoder直接把JSON解析为CryptListStruct实例,不需要你手动处理每个属性的赋值和类型转换。
内容的提问来源于stack exchange,提问作者Nurjan Ababakirov
相关产品推荐
相关产品推荐

