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

如何让Group内文本可点击?SwiftUI编译类型检查超时问题

解决SwiftUI隐私文本链接编译超时问题(App内打开Safari)

遇到的“编译器无法在合理时间内对该表达式进行类型检查”错误,本质是SwiftUI视图体内嵌套了过多复杂逻辑(比如字符串拼接、点击事件处理、URL跳转逻辑混在一起),导致编译器无法快速完成类型推导。下面是具体的拆分重构方案:

步骤1:封装App内Safari打开组件

先把SFSafariViewController封装成SwiftUI可调用的View,避免在主视图里直接处理UIKit逻辑:

import SwiftUI
import SafariServices

struct InAppSafariView: UIViewControllerRepresentable {
    let url: URL
    
    func makeUIViewController(context: Context) -> SFSafariViewController {
        SFSafariViewController(url: url)
    }
    
    func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {}
}

步骤2:拆分隐私文本的富文本生成逻辑

把带链接的隐私文本生成逻辑抽成单独的计算属性,不要直接在body里做大量字符串拼接:

struct PrivacyAgreementView: View {
    @State private var showInAppSafari = false
    @State private var selectedURL: URL?
    
    // 单独生成带链接的富文本
    private var agreementText: AttributedString {
        var baseText = AttributedString("我们尊重您的隐私,请查阅")
        
        var privacyLink = AttributedString("隐私政策")
        privacyLink.link = URL(string: "https://your-privacy-url.com")
        baseText += privacyLink
        
        baseText += AttributedString("和")
        
        var termsLink = AttributedString("服务条款")
        termsLink.link = URL(string: "https://your-terms-url.com")
        baseText += termsLink
        
        return baseText
    }
    
    var body: some View {
        Text(agreementText)
            .onTapGesture { location in
                // 简化点击事件逻辑,只做URL提取和状态切换
                guard let tappedURL = agreementText.link(at: location) else { return }
                selectedURL = tappedURL
                showInAppSafari = true
            }
            .sheet(isPresented: $showInAppSafari) {
                if let url = selectedURL {
                    InAppSafariView(url: url)
                }
            }
    }
}

关键优化点

  • 将富文本生成、点击逻辑拆分成独立模块,避免body内出现复杂嵌套表达式
  • 用状态变量控制Safari视图的展示,减少视图体内的条件判断嵌套
  • 封装UIKit组件,让主视图逻辑更简洁

如果之前的代码是直接在Text里用+拼接多个带onTapGesture的文本片段,这种嵌套会大幅增加编译器的类型推导负担,拆分后就能解决编译超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:25:25