Swift 3:如何将结构体转换为参数

12

我有一个如下的struct

struct UserInfo
{
    var userId : Int
    var firstName : String
    var lastName : String
}

我应该如何将 UserInfo 实例序列化为 Parameters 类型?

var user = UserInfo(userId: 1, firstName: "John", lastName: "Skew")

// Convert user to Parameters for Alamofire
Alamofire.request("https://httpbin.org/post", parameters: parameters)
5个回答

25

只需实现一个dictionaryRepresentation计算变量或函数:

struct UserInfo {
    var userId : Int

    var firstName : String
    var lastName : String

    var dictionaryRepresentation: [String: Any] {
        return [
            "userId" : userId,
            "firstName" : firstName,
            "lastName" : lastName
        ]
    }
}

使用方法:

var user = UserInfo(userId: 1, firstName: "John", lastName: "Skew")
let userDict = user.dictionaryRepresentation

这是一个不错的选择。在这种方法中,将对象数组转换为字典的最简单方法是什么? - KZoNE

5
你可以使用CodableFirebase库。虽然它的主要目的是与Firebase实时数据库Firestore一起使用,但它实际上可以完成你所需要的工作 - 将值转换为字典[String:Any]
你的模型将如下所示:
struct UserInfo: Codable {
    var userId : Int
    var firstName : String
    var lastName : String
}

然后您可以按以下方式将其转换为字典:
import CodableFirebase

let model: UserInfo // here you will create an instance of UserInfo
let dict: [String: Any] = try! FirestoreEncoder().encode(model)

3

您不能直接传递结构体作为参数。您需要将您的结构体转换为[String:Any]。我已经添加了一个新的变量描述,将您的内容转换为字典。

struct UserInfo
{
    var userId : Int
    var firstname : String
    var lastname : String


    var description:[String:Any] {
        get {
            return ["userId":userId, "firstname": self.firstname, "lastname": lastname] as [String : Any]
        }
    }
}

使用方法如下:

var user = UserInfo(userId: 1, firstname: "John", lastname: "Skew")

// Convert user to Parameters for Alamofire
Alamofire.request("https://httpbin.org/post", parameters: user.description)

4
这与@alexburtnik的回答有什么不同? - Wyetro
1
看起来没有区别。两个用户同时从不同的位置尝试发布类似的答案 :-) - Anand

2
在Swift 4中,您可以使用Decodable/Codable结构。

可以详细说明一下吗? - Koen.

2
如果您要将参数作为POST请求发送,则应按照以下字典格式进行传递:
let userDict = ["userId" : user.userId, "firstname" : user.firstname, "lastname" : user.lastname]

这应该作为您网络的“参数”运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接