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

Swift/SwiftUI应用输入西里尔文及表情符号时崩溃求助

问题分析与解决方案

你的崩溃根源有两个:

  1. 手动拼接URL字符串未做完整编码:只替换空格为%20远远不够,西里尔文、表情符号等非ASCII字符,以及其他URL保留字符(比如&、=)都需要做URL编码,直接拼接会导致URL格式无效。
  2. 强制解包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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:18