ios 如何在扩展函数SwiftUI中为Text UI分配更新值

7y4bm7vi  于 2023-05-23  发布在  iOS
关注(0)|答案(1)|浏览(97)

如何在Extension SwiftUI enter image description here中将更新值分配给文本值

extension Text {
    
    public func translate(text: String) -> Text{
        var translated = ""
        let conditions = ModelDownloadConditions(allowsCellularAccess: true, allowsBackgroundDownloading: true)
        GoogleTranslatorManager.shared.translator?.downloadModelIfNeeded(with: conditions) { error in
            guard error == nil else { return }
            GoogleTranslatorManager.shared.translator?.translate(text) { translatedText, error in
                guard error == nil, let translatedText = translatedText else {
                    //                    uiView.text = text
                    return
                }
                print(translatedText)
                translated = translatedText

               //**Here: How to assign updated Value to Text ** \\ 
           
            }
        }
        
        return Text(verbatim: translated)
    }
}
vi4fp9gy

vi4fp9gy1#

我看到你的方法有几个问题。
首先,将此扩展放在Text上没有多大意义-Text是一个显示String的视图。将扩展放在String上更有意义。
其次,如果你在String上做一个扩展,那么函数在self上操作-也就是String示例本身,而不是接受一个参数。
最后一个问题是转换操作是异步的,所以你不能返回值。
作为String上的扩展,它可能看起来像这样:

extension String {
   func translated(completionHandler: @escaping (Result<String, Error>) -> Void) ) {
       let conditions = ModelDownloadConditions(allowsCellularAccess: true, allowsBackgroundDownloading: true)
           
       GoogleTranslatorManager.shared.translator?.downloadModelIfNeeded(with: conditions) { error in
            guard error == nil else { 
               completionHandler(.failure(error))
            }
            GoogleTranslatorManager.shared.translator?.translate(self) { translatedText, error in
                guard error == nil, let translatedText else {
                   completionHandler(.failure(error))
                }
                completionHandler(.success(translatedText))
            }
        }
    }
}

你可以这样称呼它:

let someString = "parlez vous français"
someString.translated { result in 
    switch result {
        case .failure(let error):
            print("There was an error \(error)")
        case .success(let translated):
            print("The translated string is: \(translated)"
     }
}

现在,您仍然有实际更新屏幕上的Text视图的问题。您可以在某些模型中使用@State字符串属性或@Published属性,并更新该字符串值,视图将更新(您可能需要将其调度到主队列)。
真的,我不认为在String上创建这个扩展有什么价值。这真的是你希望所有字符串都具有的新行为吗?最好将其实现为翻译管理器对象中的一个函数。

相关问题