文本不显示 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 Views 的 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 中的 vars 与 javascript 中的 vars 不同。在 JavaScript 中,重新声明将覆盖 valueWeWantToGrab 的先前值,并且您的代码会正常工作。然而,在 Swift 中,这实际上在 getter 函数的局部范围内声明了一个新的、不同的变量。查看the Swift docs 了解更多关于变量声明如何在 Swift 中工作的信息。

【讨论】:

以上是关于文本不显示 Var 的值。迅速的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 文本输入不显示 v-model 的值

如何在不重复单词并遍历整个数组的情况下从数组中随机播放文本? (迅速)

如何修复当前页面不显示真? [迅速]

重新加载tableview时不显示刷新动画|迅速

FMDB 不显示任何东西 - 迅速

jstl表达式的foreach标签只执行循环不显示取出的值