xcode - 在 Swift 中使用结构时如何简洁地定义模型对象?

标签 xcode swift struct model

我在某处读到,在使用 Swift 传递模型数据时使用结构是最佳实践。

我一直在这样做,但我一直在想,对于创建大型(且不断增长的)用户数据对象,我是否可以做些什么:

struct UserAccount {

    var id: String?
    let authId: String

    let emailAddress: String
    let mobilePhoneNumber: String

    let firstName: String
    let lastName: String

    let countryCode: String
    let homepageUrl: String
    let tagline: String

    let pictureUrl: String

    let accountState: AccountState = .NoAccount

    // ... 
}

这或多或少是我在创建用户帐户时使用的,但后来感觉必须在代码中实例化巨大的对象是很麻烦和错误的。我正在使用 json-swift 解析 JSON 响应但随后必须单独实例化模型,如下所示:

let id = jsonData["id"].string!
let authId = jsonData["authId"].string!
let emailAddress = jsonData["emailAddress"].string!
let mobilePhoneNumber = jsonData["mobilePhoneNumber"].string!
let firstName = jsonData["firstName"].string!
let lastName = jsonData["lastName"].string!
let countryCode = jsonData["countryCode"].string!
let homepageUrl = jsonData["homepageUrl"].string!
let tagline = jsonData["tagline"].string!
let pictureUrl = jsonData["pictureUrl"].string!
let accountState = convertAccountStateStringToEnum(jsonData["accountState"].string!)


let userAccount = UserAccount(
    id: id,
    authId: authId,
    emailAddress: emailAddress,
    mobilePhoneNumber: mobilePhoneNumber,
    firstName: firstName,
    lastName: lastName,
    countryCode: countryCode,
    homePageUrl: homepageUrl,
    tagline: tagline,
    pictureUrl: pictureUrl,
    accountState: accountState
)

上面我在实例化结构之前实例化了变量,这似乎很荒谬,但我这样做的原因是,当 IDE 从结构中给我类型强制错误时,很难理解出了什么问题,所以这让我在进行模型更改时可以更快地排除故障。对此有什么想法吗?

我的问题:

稍后该用户对象可能在服务器端包含更多数据,使用 50 多行实例化使用模型似乎不是一个好主意,因此:

  1. 是否有以更简单的方式创建结构的解决方案?该模式有名称吗?
  2. 我应该创建与特定任务相关的用户模型吗?例如,用于 GET 或 PUT 配置文件的 UserAccount 模型可能与用于验证、获取用户设置或列出我的服务中最受欢迎的帐户的模型不同。
  3. 人们是否只是保持原样并定义映射器以便没有冗余?如果是这样 - 什么是这方面的一个很好的例子?

谢谢。

最佳答案

遇到这种情况时,我会为采用 JSON 数据的模型构建另一个初始化器:

struct UserAccount {
    // ...
    init(jsValue: JSValue) {
        id = jsonData["id"].string!
        authId = jsonData["authId"].string!
        emailAddress = jsonData["emailAddress"].string!
        mobilePhoneNumber = jsonData["mobilePhoneNumber"].string!
        firstName = jsonData["firstName"].string!
        lastName = jsonData["lastName"].string!
        countryCode = jsonData["countryCode"].string!
        homepageUrl = jsonData["homepageUrl"].string!
        tagline = jsonData["tagline"].string!
        pictureUrl = jsonData["pictureUrl"].string!
        accountState = convertAccountStateStringToEnum(jsonData["accountState"].string!)
    }
}

然后您可以简单地从您的 JSON 数据创建新的 UserAccount 实例:

let userAccount = UserAccount(jsValue: jsonData)

关于xcode - 在 Swift 中使用结构时如何简洁地定义模型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610362/

相关文章:

ruby - 无法在特立独行者上安装 cocoapods

objective-c - UINavigationController 用于 UITabbarController 内部的表格

ios - 使用gestureRecognizer从 super View 中删除

swift - 检测 float 的变化

c++ - 尝试在 C++ 中使用结构时出错

c - 为什么编译器可以接受这个?

ios - 如何下载 ARImage (.SCN) 文件以在 ARSCNView 中显示图像?

iphone - iOS 问题。我可以分发我的应用程序的 Xcode 模拟器版本吗?

ios - 如何将 URL 作为图像加载?

c - 如何从结构指针数组中取消引用