swift2 使用Alamofire ObjectMapperMap到Swift对象的问题显示为零

rkttyhzu  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(227)

我是iOS和Swift开发环境的新手。我试图使用Alamofire来拉取JSON,并使用AlamofireObjectMapper将检索到的JSON集合Map回我的Swift对象。
问题是我可以通过Alamofire请求获取JSON,并且显示了计数,但是Map部分似乎显示为零。这是我遗漏的东西。感谢帮助。

模型类别

import UIKit
import CoreLocation
import ObjectMapper

class BranchObjectMapper : Mappable {
    // MARK: Properties
    var id: Int?
    var cityId: Int?
    var areaId: Int?
    var name: String?
    var nameAr: String?
    var branchAddr: String?
    var branchAddr2: String?
    var location: CLLocation?

    required init?(_ map: Map) {
        mapping(map)
    }

    func mapping(map: Map) {
        id     <- map["id"]
        cityId    <- map["cityId"]
        areaId  <- map["areaId"]
        name  <- map["name"]
        nameAr  <- map["nameAr"]
        branchAddr  <- map["branchAddr"]
        branchAddr2  <- map["branchAddr2"]
        location  <- map["location"]
    }

}

请求viewDidLoad()中的零件

Alamofire.request(.GET, UrlEndpoints.branchUrl()).responseArray { (response: Response<[BranchObjectMapper], NSError>) in

    self.branchList = response.result.value!

    print(self.branchList.count) // count is correct

    for branch in self.branchList {      
        print(branch.id) // prints nil
        print(branch.id) // prints nil
    }
}

先谢谢你
完整的JSON响应如下所示。在模型中只构建了需要的响应。
[{“编号”:“16”,“区域编号”:“17”,“名称”:“阿尔阿齐克”,“城市编号”:4”,“邮政编码”:“",“名称”:“,”分支地址“:“测试”,“分支地址2”:“测试“纬度”:“24.60425”,“经度”:“46.629631”,“城市编号”:“1”}]

wwtsj6pe

wwtsj6pe1#

我认为你缺少了ObjectMapper库的正确文档。检查这个Github ObjectMapper。
以下是lib支持的类型:

  • Bool
  • Bool
  • Double
  • Float
  • String
  • RawRepresentable(枚举)
  • Array<AnyObject>
  • Dictionary<String, AnyObject>
  • Object<T: Mappable>
  • Array<T: Mappable>
  • Array<Array<T: Mappable>>
  • Set<T: Mappable>
  • Dictionary<String, T: Mappable>
  • Dictionary<String, Array<T:Mappable>>
  • 以上所有选项
  • 上述的隐含未 Package 选项

因此,如果您尝试Map不在该列表中的Object,则结果为nil
在您的情况下是var location: CLLocation?
如果需要MapCLLocation对象,一种方法是使用所有属性MapCustomCLLocation,如下所示:JSON(我不知道你的JSON,这是一个例子)

"location":{
    "long": 43.666,
    "lat": 73.4
}

Swift:创建另一个文件“CustomCLLocation”,例如,与第一个文件类似,但用于将CLLocation与您的Json进行Map

var latitude: Double?
var longitude: Double?

required init?(_ map: Map) {
mapping(map)

}
func mapping(map: Map) {

   longitude <- map["long"]
   latitude <- map["lat"]
}

现在,您可以Map一个“假”CLLocation对象:可变位置:是否自定义CL位置?
然后,如果您想要一个真正的CLLocation.,只需创建一个简单扩展(将其添加到CustomCLLocation文件中):

extension CLLocation {
     public class func createFromCustomCLLocation(custom: CustomCLLocation) -> CLLocation {
         return self.init(custom.latitude,custom.longitude)
     }
}

使用转换:

var locationCLL = CLLocation.createFromCustomCLLocation(location) // now is a CLLocation

已编辑:Alamofire请求

我在我的应用程序上有相同的要求与最新版本的AlamofireObjectMapper为ios 8.0 +

Alamofire.request(.GET, UrlEndpoints.branchUrl()).responseArray { (response: [BranchObjectMapper]?, error : ErrorType?) in
    if(error != nil) {
        print(error)
    }else{
        print("data downloaded")

        if let response = response {
            branchList(response)
            for branch in self.branchList {
                print(branch.id)
                print(branch.name)
            }
        }
    }
}
bq8i3lrv

bq8i3lrv2#

如果你在MapString和Int变量时遇到问题,那是因为你忘了在var之前加上dynamic

示例:dynamic var id : Int?

相关问题