Skip to main content
 首页 » 操作系统

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

2024年01月01日40xiaohuochai

我在某处读到,在使用 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)