文本不显示 Var 的值。迅速
Posted
技术标签:
【中文标题】文本不显示 Var 的值。迅速【英文标题】:Text not displaying value of Var. Swift 【发布时间】:2021-05-31 21:37:42 【问题描述】:我是初学者,但我试图在文本字段中显示“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)
【问题讨论】:
【参考方案1】:问题是你声明了变量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
...
另外,为了使您的代码更简洁(虽然不是让它工作所必需的),将加载数据的代码移动到专用方法而不是将其放在 @ 的 getter 中可能是个好主意987654333@ 变量(作为一般经验法则,尽量只将 UI 元素放在 SwiftUI View
s 的 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
s 与 javascript 中的 var
s 不同。在 JavaScript 中,重新声明将覆盖 valueWeWantToGrab
的先前值,并且您的代码会正常工作。然而,在 Swift 中,这实际上在 getter 函数的局部范围内声明了一个新的、不同的变量。查看the Swift docs 了解更多关于变量声明如何在 Swift 中工作的信息。
【讨论】:
以上是关于文本不显示 Var 的值。迅速的主要内容,如果未能解决你的问题,请参考以下文章