【发布时间】:2018-11-05 10:01:56
【问题描述】:
这是一个相当具体的情况,所以我会尝试解释尽可能多的细节。
我正在制作一个应该获取预订列表的应用程序,可以在其中添加新预订,或点击现有预订并获得有关预订详细信息可编辑的预订的“详细”视图,然后保存它的选项。
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。点击保存后,我会从所有 TextField、DatePickers 等中更新模型,然后根据是新的预订还是现有的编辑进行网络发布或提出请求。
如果我点击添加,我会传递一个空的 Reservation 对象,因此“详细信息”页面上的所有字段都是空的,并在单击“保存”按钮时进行验证。
到目前为止它可以工作,但它周围看起来“反 Swift”。很多选项,很多守卫/展开,“master”和“details”视图之间的紧密耦合,在闭包中设置从网络检索的数据(实际的 Alamofire 调用是隐藏的,但我不确定什么会是 nil,所以我必须使用 nil-check/chaining 将每个属性设置为它的 TextField)。
关于如何改进这一点的任何架构技巧? 所有关于这方面的教程都是一种简单的、本地的、非可选的方法,让一切看起来都很闪亮。
请记住,我没有任何文档可以为 null(之前通过 Web 或内部桌面应用程序输入的数据)。
【问题讨论】:
-
你试过在结构中给一个初始值,你能做到吗?
标签: ios swift model-view-controller master-detail