代码之家  ›  专栏  ›  技术社区  ›  ZN123

iOS体系结构:具有许多选项的对象

  •  3
  • ZN123  · 技术社区  · 7 年前

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

    我正在制作一个应用程序,它应该获取一个预订列表,在那里可以添加新的,或点击现有的预订,并有一个关于预订的“详细”视图,其中预订详细信息是可编辑的,然后有一个选项来保存它。

    restapi已经在C#中完成,并且没有关于什么可以为null和什么不能为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
    
    }
    

    到目前为止,它是有效的,但它看起来到处都是“反迅捷”。很多选项,很多保护/解包,在“主”和“细节”视图之间紧密耦合,在闭包中设置从网络检索的数据(实际的Alamofire调用是隐藏的,但我不确定什么是nil,所以我必须用nil检查/链接将每个属性设置为它的TextField)。

    关于如何改进这一点有什么建筑学上的建议吗? 所有关于这个的教程都提供了一个简单的、本地的、非可选的方法,使所有东西看起来都很闪亮。

    请记住,我没有文档什么是允许为空的(数据以前通过网络输入,或内部桌面应用程序)。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Jesus Rodriguez    7 年前

    我能想到的一件事就是通过定义默认值来消除某些属性的可选性,例如 var babies: Int = 0 或者如果你用的是斯威夫特的可解码软件,你可以这样做

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

    babies 变量是可选的

    根据评论编辑: 这个??aka coalescing nil操作符将尝试展开左侧的可选值,如果该值为nil,它将返回右侧的值,在本例中为0

        2
  •  1
  •   fewlinesofcode user10694837    7 年前

    我认为你不应该为可选的和可选的拆开包装而烦恼。

    权力之一 是, 任何使用你的代码的人都知道这件事 nil 作为它的价值 .

    guards , 合并或任何其他解包技术描述您的业务逻辑。事实上,你有一个“大”的模型,在我看来,只是一个应该被接受的事实。在代码保持可靠、可读性、可测试性和可理解性、不会造成不必要的副作用等之前,一切都没问题。

    您可以通过在展开上添加另一层抽象来“修复”这个问题。但是,国际海事组织应该非常谨慎地这样做,而且只针对 实际效益 .

        3
  •  0
  •   HAK    7 年前

    SwiftyJson

    如果某个类型转换失败,它不会中断,但会给出一个空值,这样应用程序就可以在不检查每个变量的情况下工作。

    下面是提供的基本转换示例。详情请查阅他们的文件。

    // Getting a double from a JSON Array
    let name = json[0].double
    
    // Getting an array of string from a JSON Array
    let arrayNames =  json["users"].arrayValue.map({$0["name"].stringValue})
    
    // Getting a string from a JSON Dictionary
    let name = json["name"].stringValue
    
    // Getting a string using a path to the element
    let path: [JSONSubscriptType] = [1,"list",2,"name"]
    let name = json[path].string
    
    // Just the same
    let name = json[1]["list"][2]["name"].string
    
    // Alternatively
    let name = json[1,"list",2,"name"].string