文本不显示 Var. Swift 的值



我是初学者,但我试图在文本字段中显示"valueWeWantToGrab",但没有显示结果。

这是我显示某人的Instagram关注者数量的代码

struct ContentView: View {
@State var valueWeWantToGrab = ""
var body: some View {

let baseUrl = "http://www.instagram.com/"
let username = ""
let url = URL(string: baseUrl + username)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
print("data was nil")
return
}
guard let htmlString = String(data: data, encoding: .utf8) else {
print("couldn't cast data into String")
return
}
print(htmlString)
let leftSideString = """
edge_followed_by":{"count":
"""
let rightSideString = """
},"followed_by_viewer
"""
guard
let leftSideRange = htmlString.range(of: leftSideString)
else {
print("couldn't find left range")
return
}
guard
let rightSideRange = htmlString.range(of: rightSideString)
else {
print("couldn't find right range")
return
}
let rangeOfTheData = leftSideRange.upperBound..<rightSideRange.lowerBound
var valueWeWantToGrab = htmlString[rangeOfTheData]
print(valueWeWantToGrab) // prints the follower count: 19093
}
Text(valueWeWantToGrab)
}

}

问题是你声明变量valueWeWantToGrab两次:一次在顶部用@State注释,一次在body变量的getter函数中朝向底部。 您实际上想在底部做的是分配给在顶部声明的变量,而不是通过从行var valueWeWantToGrab = htmlString[rangeOfTheData]中删除var来声明新变量。这样做,您还必须使用字符串初始值设定项(String())包装htmlString[rangeOfTheData],因为htmlString[rangeOfTheData]为您提供Substring类型的值,而不是String类型的值。结果如下:

...
let rangeOfTheData = leftSideRange.upperBound..<rightSideRange.lowerBound
valueWeWantToGrab = String(htmlString[rangeOfTheData])
print(valueWeWantToGrab) // prints the follower count: 19093
...

此外,为了使您的代码更干净(尽管不是使其工作所必需的),最好将加载数据的代码移动到专用方法中,而不是将其放在body变量的 getter 中(作为一般经验法则,尝试只将 UI 元素放在 SwiftUIViews 的body中,并在其他地方执行业务逻辑 - 这将帮助您保持代码干净易读)。然后,您可以在ContentView的初始值设定项中调用该方法。这样做的好处是,您可以在其他地方重用该方法 - 例如,将来实现刷新按钮。最终结果可能如下所示:

struct ContentView: View {
@State var valueWeWantToGrab = ""

var body: some View {
Text(valueWeWantToGrab)
}

init() {
loadFollowerCount()
}

private func loadFollowerCount() {
let baseUrl = "http://www.instagram.com/"
let username = ""
let url = URL(string: baseUrl + username)!
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
print("data was nil")
return
}
guard let htmlString = String(data: data, encoding: .utf8) else {
print("couldn't cast data into String")
return
}
print(htmlString)
let leftSideString = """
edge_followed_by":{"count":
"""
let rightSideString = """
},"followed_by_viewer
"""
guard
let leftSideRange = htmlString.range(of: leftSideString)
else {
print("couldn't find left range")
return
}
guard
let rightSideRange = htmlString.range(of: rightSideString)
else {
print("couldn't find right range")
return
}
let rangeOfTheData = leftSideRange.upperBound..<rightSideRange.lowerBound
valueWeWantToGrab = String(htmlString[rangeOfTheData])
print(valueWeWantToGrab) // prints the follower count: 19093
}
}
}

如果你来自 Web 开发背景(这就是我的猜测),最后一个提示:Swift 中的var与 JavaScript 中的var不同。在 JavaScript 中,重新声明将覆盖以前的valueWeWantToGrab值,并且您的代码将起作用。然而,在 Swift 中,这实际上在 getter 函数的局部范围内声明了一个新的、不同的变量。查看 Swift 文档,了解有关变量声明在 Swift 中如何工作的更多信息。

最新更新