Swift/SwiftUI应用输入西里尔文及表情符号时崩溃求助
问题分析与解决方案
你的崩溃根源有两个:
- 手动拼接URL字符串未做完整编码:只替换空格为
%20远远不够,西里尔文、表情符号等非ASCII字符,以及其他URL保留字符(比如&、=)都需要做URL编码,直接拼接会导致URL格式无效。 - 强制解包
URL(string:):当URL字符串无效时,URL(string:)会返回nil,用!强制解包会直接触发崩溃。
正确的实现方式:用URLComponents构建编码后的URL
URLComponents会自动处理所有参数的URL编码,避免手动编码的遗漏,同时可以安全处理URL创建失败的情况。修改后的代码如下:
func search(query: String) async throws { // 初始化URLComponents并设置基础地址 var components = URLComponents() components.scheme = "https" components.host = "myapilink" components.path = "/api/find" // 添加查询参数,URLComponents会自动编码特殊字符 components.queryItems = [ URLQueryItem(name: "q", value: query), URLQueryItem(name: "apikey", value: "areallylongapikey") ] // 安全获取URL,失败则抛出错误 guard let url = components.url else { throw NSError(domain: "SearchError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Failed to create valid URL"]) } // 发起请求并解析响应 var request = URLRequest(url: url) let (data, _) = try await URLSession.shared.data(for: request) let searchResponse = try JSONDecoder().decode(SearchResponse.self, from: data) lists = searchResponse.lists }
为什么这个方案有效?
URLQueryItem会自动对参数值进行百分号编码,覆盖所有需要编码的字符(包括西里尔文、表情、空格、特殊符号等),确保URL格式完全符合标准。- 通过
guard let安全校验URL是否创建成功,避免强制解包导致的崩溃,同时可以抛出明确的错误信息便于调试。
内容的提问来源于stack exchange,提问作者Tanislav Ivanov
相关产品推荐
相关产品推荐

