iOS 架构 : Object with many optionals

标签 ios swift model-view-controller master-detail

这是一个相当具体的情况,所以我会尝试尽可能多地解释细节。

我正在制作一个应获取预订列表的应用程序,可以在其中添加新预订或点击现有预订,并在预订详细信息可编辑的情况下获得有关预订的“详细” View ,然后保存它的选项。

REST API 已在 C# 中完成,并且没有关于什么可以和不能为 null 的文档(nil,在 Swift 的情况下)。所以我结束了:

    struct Reservation: Codable {
var objectID: String?
var objectName: String?
var objectPrefix: String?
var reservationNumber: String?
var grownUPS: Int?
var teens: Int?
var children: Int?
var babies: Int?
var reservationDate: String?
var dateInserted: String?
var toDate:String?
var fromDate: String?
var price: Int?
var owner: String?
var note: String?
var agencyName: String?
var renterNote: String?
var reservationID: String?
    // 20 more properties

init(objectID: String? = nil,
         partnerID: String? = nil,
         objectName: String? = nil,
    // 20 more properties        
    )
    {

    self.objectID = objectID
    self.objectName = objectName
 // 20 more properties

}

因此,当我点击一个对象时,我会传递一个 Reservation 对象,检查每个字段,如果不是 nil,则设置为 TextField。单击“保存”后,我从所有 TextFields、DatePickers 等更新模型,然后根据是新预订还是编辑现有预订进行网络发布或提交请求。

如果我点击添加,我会传递一个空的 Reservation 对象,因此“详细信息”页面上的所有字段都是空的,并在单击“保存”按钮时进行验证。

它到目前为止有效,但它的周围看起来“Anti-Swift”。很多可选项,很多守卫/解包,“主”和“细节” View 之间的紧密耦合,设置从网络检索的数据闭包(隐藏实际的 Alamofire 调用,但我不确定什么是零,所以我必须使用零检查/链接将每个属性设置为其 TextField。

关于如何改进这一点的任何架构技巧? 所有关于这方面的教程都采用了一种简单的、本地的、非可选的方法,使一切看起来都很 Shiny 。

请记住,我没有记录允许为空的内容(之前通过网络或内部桌面应用程序输入的数据)。

最佳答案

我能从头顶想到的一件事是通过定义默认值来删除某些属性的可选性,例如 var babies: Int = 0 或者如果您使用的是 Swift 的可解码你可以做这样的事情

babies = (try? container.decode(Int.self, forKey: .babies)) ?? 0

所以你不必让你的babies变量成为可选的

根据评论编辑:??又名合并 nil 运算符将尝试解包左侧的可选值,如果它是 nil,它将返回右侧的值,在本例中为 0

关于iOS 架构 : Object with many optionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53152082/

相关文章:

c# - 为什么这个 MVC 路由不起作用?

ios - 某些设备上的 `dispatch_semaphore_wait()` 有问题吗?

swift - 更改 UINavigationbar 中元素的色调颜色(iOS 11)

iphone - NSURLConnection 在我得到 Error Domain=NSPOSIXErrorDomain Code=57 后不会响应

swift - 我如何用具有多个字符的字符串拆分字符

swift - 泛型的泛型? A<T<U>> 类?

Java Swing 程序结构

java - SpringMVC 中 Redirect 或 RedirectModel 问题的解决方案

ios - 使用终端通过 USB 将文件从计算机 (Mac) 传输到 iOS 设备(必要时越狱)

ios - UIImagePickerController 相机无法快速工作