ios - Swift 错误:调用函数写入文本时,“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”
问题描述
我正在尝试使用完成来编写文本,但是当我尝试运行它时出现错误“类型'()'不能符合'视图';只有结构/枚举/类类型可以符合协议”。任何帮助都会很棒,谢谢!
VStack {
Image("external_white")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 60, height: 60.0)
Text("External IP")
getExternalAddress("") { (test) -> Any in
Text(test)
}
}
调用函数:
func getExternalAddress(_ key: String, completion: @escaping (String) -> Any) {
var test = key
Ipify.getPublicIPAddress { result in
switch result {
case .success(let ip):
print(ip + " ip") // "210.11.178.112"
test = ip
print(test + " test")
completion(test)
case .failure(let error):
print(error.errorDescription)
}
}
解决方案
您不应该尝试在视图中做所有事情,SwiftUI 引入了几种在对象之间发布数据的方法,因此请改用它。
在此示例中,我将您的函数移动到另一个可以观察并发布找到的 IP 地址的类
class IpFinder: ObservableObject {
@Published var ipAddress: String = ""
func getExternalAddress(_ key: String) {
var test = key
Ipify.getPublicIPAddress { result in
switch result {
case .success(let ip):
ipAddress = ip
case .failure(let error):
print(error.errorDescription)
}
}
}
}
然后在你的视图中观察这个类的一个实例
struct ContentView: View {
@ObservedObject var ipFinder: IPFinder = IPFinder()
@State var value = 0
@State private var key = ""
var body: some View {
VStack {
Image("external_white")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 60, height: 60.0)
Text("External IP")
Text(ipFinder.ipAddress)
TextField("key", text:$key)
Button(action: {
ipFinder.getExternalAddress(key)
}, label: {
Text("Get IP address")
})
}
}
}
推荐阅读
- python - 无法访问熊猫
- python - 使用 BeautifulSoup 从具有不同类的多个跨度中提取文本
- html - HTML\CSS\style:隐藏一个 HTML 容器及其 HTML 子控件
- kotlin - Libgdx 自定义 Actor 未触发 clicked 和 touchDown 事件
- swift - NSPersistentCloudKitContainer 完成同步时如何获得通知?
- javascript - 无法在vue js中的@click方法上传递spring模型值
- imagemagick - 替换矩形区域中的颜色
- https - HTTPS GET 请求不适用于 sim7000e lte 模块
- sql - 20.000行的层次结构父子
- for-loop - 我对 for 循环有疑问。它没有执行