我试图使用补全来写文本,但我得到了错误"类型"(("不能符合"视图";只有结构/枚举/类类型才能符合协议";当我试着运行它的时候。任何帮助都会很棒,谢谢!
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")
})
}
}
}