【问题标题】:Trying to retrieve Data from a GET Request尝试从 GET 请求中检索数据
【发布时间】:2017-06-16 01:09:46
【问题描述】:

我正在尝试通过 Alamofire 发出 GET 请求并期望返回数据。当我在我的 Viewcontroller 中初始化我的 Data 类时它工作正常,比如

 let dataRequest = DataClass()

然后调用我的函数来获取数据,但是当我尝试像这样声明它时

 let dataRequest: DataClass!

并尝试调用 GET 函数 它说意外发现为零。

我强制展开而不是初始化的原因是因为在我的数据类中,我有一个像 init(address: String, Zip: Double) 这样的 init 函数。

我将分享我的课程,所以也许有人可以给我一些关于为什么它返回 nil 的见解。

class FirstViewController {
var dataRequest: DataClass!

   override func viewDidLoad() {
    super.viewDidLoad()

   dataRequest.downloadData { // Returns nil at this point
    let initData = DataClass(dataRequest._address)


}

 }
}

数据类

Class DataClass {
var _address: String!
 init(address: String) {
 _address = address
 }
func downloadProperties(completed: @escaping downloadComplete) {
    Alamofire.request(Listings).responseJSON { response in
        if let result = response.result.value {
            let dict = JSON(result)
            if let data = dict["data"].dictionary {

                if let listingResultDict = data["listings"]?.array  {

                    for list in listingResultDict {

                        if let propertyAddress = list["data"]["name"].string {
                            self._address = propertyName
                        }
                      }
                    }
                  }
                }
              complete()
             }
           }

    }

常量

typealias downloadComplete = () -> ()

如果需要进一步说明,请告诉我。

【问题讨论】:

    标签: ios swift networking get alamofire


    【解决方案1】:

    您从未在FirstViewController 中初始化dataRequest

    执行DataClass! 不会初始化它。它基本上告诉编译器你保证这个值不是 nil 并且不是可选的。

    你仍然必须给它一个初始值。这就是为什么当你这样做的时候:

    let dataRequest = DataClass() 它可以工作(在这种情况下,dataRequest 可能是可选的)。你也可以这样做:let dataRequest: DataClass! = DataClass() 告诉编译器它不会是 nil 并且会有一个初始值。

    【讨论】:

    • 我无法调用 DataClass 而不使用 init 函数对其进行初始化,并且在我调用 downloadProperties 函数之前数据是空的。
    • @bradfordgray;我的建议会奏效。否则执行dataRequest = Data(...) 然后执行dataRequest.downloadData AFTER。
    • 是的,你是对的,我只需要在初始声明中添加虚拟数据,然后我就可以调用下载并填充所有内容。谢谢。
    • @bradfordgray;您还可以创建另一个将地址设置为空白字符串的 init() 函数:)
    【解决方案2】:

    你还没有初始化

    dataRequest
    

    调用前

    dataRequest.downloadData { ... }
    

    你应该添加

    dataRequest = DataClass()
    

    这就是它返回 nil 值的原因

    【讨论】:

    • 但是如果我调用dataRequest = DataClass(),它需要我返回init。虽然在我调用 downloadData 之前地址是空的。
    猜你喜欢
    • 2021-10-06
    • 2019-06-26
    • 2017-09-01
    • 1970-01-01
    • 2021-09-05
    • 2020-04-04
    • 2020-02-27
    • 2020-10-09
    • 2018-06-11
    相关资源
    最近更新 更多