帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:模式    framework  Swift  BASE  
An iOS framework for creating JSON-based models. Written in Swift.

  • 源代码名称:ModelRocket
  • 源代码网址:http://www.github.com/ovenbits/ModelRocket
  • ModelRocket源代码文档
  • ModelRocket源代码下载
  • Git URL:
    git://www.github.com/ovenbits/ModelRocket.git
  • Git Clone代码到本地:
    git clone http://www.github.com/ovenbits/ModelRocket
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ovenbits/ModelRocket
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • ModelRocket

    Build StatusCarthage compatibleCocoaPods CompatibleLicensePlatform

    用于创建基于json的模型的iOS框架。 用 Swift 编写( 因为完全规则 ! )

    要求

    • iOS 8.0 +
    • Xcode 7.3
    • Swift 2.2

    安装

    嵌入式框架需要 iOS 8的最低部署目标

    Carthage

    是一个分散的依赖管理器,它自动将框架添加到你的Cocoa 应用程序的过程中。

    你可以使用以下命令使用 Homebrew 安装 Carthage:

    $ brew update
    $ brew install carthage

    要使用Carthage将ModelRocket集成到Xcode项目中,请在 Cartfile 中指定它:

    github"ovenbits/ModelRocket"

    然后,运行 carthage update

    按照的自述文件中的当前说明进行操作,以获取有关安装说明的信息。

    CocoaPods

    CocoaPods 是 Cocoa 项目的依赖项管理器。

    CocoaPods 0.36为 Swift 和嵌入式框架添加支持。 你可以使用以下命令安装它:

    $ gem install cocoapods

    要使用CocoaPods将ModelRocket集成到Xcode项目中,请在 Podfile 中指定它:

    source 'https://github.com/CocoaPods/Specs.git'platform :ios, '8.0'use_frameworks!
    pod 'ModelRocket'

    然后,运行 pod install

    Swift 软件包管理器

    包管理器是苹果提供的依赖管理工具,仍然在早期设计和开发中。 有关更多信息,请查看它的页面。

    你可以使用 Swift 包管理器来安装 ModelRocket,方法是在 Package.swift file: 中添加它作为一个依赖项

    importPackageDescriptionlet package =Package(
     name: "PROJECT_NAME",
     targets: [],
     dependencies: [
    . Package(url: "https://github.com/ovenbits/ModelRocket.git", versions: "1.2.3"..< Version.max)
     ]
    )

    用法

    创建自定义对象

    classVehicle: Model {
     let make = Property<String>(key: "make")
     let model = Property<String>(key: "model", required: true)
     let year = Property<Int>(key: "year") { year inif year <2015 {
     // offer discount }
     }
     let color = Property<UIColor>(key: "color", defaultValue: UIColor.blackColor())
    }

    注意:与所有 Swift 变量一样,除非需要 var,否则应该始终使用 let 。 对于模型对象,let 应该用于所有 Property[Array|Dictionary] 属性,因为它仍然允许更改基础 value

    支持类型
    • String
    • Bool
    • Int
    • UInt
    • Double
    • Float

    除了上面的核心类型,ModelRocket还支持开箱即用的其他几个类的序列化:

    • NSDate - ISO8601-formatted字符串( 2015-05-31T19:00:17.000+0000 )
    • UIColor - 十六进制颜色字符串( #f6c500 )
    • NSURL - 任何url字符串( http://ovenbits.com )
    • NSNumber - 任何数字,都可以以用来代替 DoubleFloatIntUInt

    创建具有类型化 array的对象

    // `Model` subclasses get `fromJSON` and `toJSON` implementations on `JSONTransformable` for free,// but explicit `JSONTransformable` conformance is still requiredextensionVehicle: JSONTransformable {}classVehicles: Model {
     let vehicles = PropertyArray<Vehicle>(key: "vehicles")
    }

    PropertyArray 符合 CollectionType,因这里,在循环访问值时,.values 语法不是必需的。 例如:

    let allVehicles =Vehicles(json: <json>)// using `.values` syntaxfor vehicle in allVehicles.vehicles.values {
    }// using `CollectionType` conformancefor vehicle in allVehicles.vehicles {
    }

    使用类型化字典创建对象

    classCar: Vehicle {
     let purchasedTrims = PropertyDictionary<Int>(key: "purchased_trims")
    }

    PropertyDictionary 符合 CollectionType,因这里,在遍历密钥和值时,.values 语法不是必需的。 例如:

    let vehicle =Vehicle(json: <json>)// using `.values` syntaxfor (key, trim) in vehicle.purchasedTrims.values {
    }// using `CollectionType` conformancefor (key, trim) in vehicle.purchasedTrims {
    }

    注:字典中的所有对象必须具有相同的类型。 如果没有,应用程序不会崩溃,但是不同类型的值将被丢弃

    初始化并使用自定义对象

    // instantiate objectlet vehicle =Vehicle(json: json)// get property typeprintln("Vehicle make property has type: (vehicle.make.type)")// get property valueiflet make = vehicle.make.value {
     println("Vehicle make: (make)")
    }

    模型对象也包含一个failable初始化器,它将只返回一个初始化的对象,如果所有标记为 required = true的属性都不是。

    // instantiate object, only if `json` contains a value for the `make` propertyiflet vehicle =Vehicle(strictJSON: json) {
     // it's best to avoid implicitly unwrapped optionals, however, since `vehicle` is initialized iff `make` is non-nil, if can be force-unwrapped safely hereprintln("Vehicle make: (vehicle.make.value!)")
    }else {
     pintln("Invalid JSON")
    }

    自定义对象的子类化

    classCar: Vehicle {
     let numberOfDoors = Property<Int>(key: "number_of_doors")
    }

    添加自定义对象作为其他对象的属性

    自定义对象必须通过定义以下变量/函数来符合JSONTransformable协议

    • 类函数 fromJSON ( JSON: JSON ) ->?
    • 函数 toJSON() -> AnyObject
    classVehicle: Model {
     let manufacturer = Property<Manufacturer>(key: "manufacturer")
    }classManufacturer: Model {
     let companyName = Property<String>(key: "company_name")
     let headquarters = Property<String>(key: "headquarters")
     let founded = Property<NSDate>(key: "founded")
    }extensionManufacturer: JSONTransformable {
     classfuncfromJSON(json: JSON) -> Manufacturer? {
     returnManufacturer(json: json)
     }
     functoJSON() ->AnyObject {
     returnself.json().dictionary }
    }

    使用 enum-作为属性

    只要 enum 符合 JSONTransformable 协议,ModelRocket就支持 Property[Array|Dictionary] 属性的enum 类型。

    作为一个简单的例子,车辆内部的材料类型可以以使用如下 enum:

    enumVehicleInterior: String{
     caseFabric="fabric"caseLeather="leather"}extensionVehicleInterior: JSONTransformable {
     staticfuncfromJSON(json: JSON) -> VehicleInterior? {
     returnVehicleInterior(rawValue: json.stringValue)
     }
     functoJSON() ->AnyObject {
     return rawValue
     }
    }classVehicle: ModelRocket {
     let interior = Property<VehicleInterior>(key: "interior")
    }

    属性 postProcess 钩子

    PropertypostProcess 闭包( 在 PropertyArrayPropertyDictionary 上也可用) 提供了在从JSON初始化了 Model 对象的所有属性之后,在 Model 对象初始化之前完成工作的机制。

    classVehicles: Model {
     let vehicles = PropertyArray<Vehicle>(key: "vehicles") { (values) ->Voidinfor vehicle in values {
     println("postHook vehicle: (vehicle.make.value!)")
     }
     }
    }

    .value 访问器用法 Pattern

    ModelRocket属性的类型为 Property<T> 。 访问属性值时,你可以通过 Property.value,e.g.:

    let vehicleMake = make.value

    完全可以接受 Property的并直接访问属性 value 。 但是,你可能需要对模型对象使用不同的public API 。

    privatelet _make = Property<String>(key: "make")publicvar make:String {
     get {
     return make.value??"unknown make" }
     set {
     make.value= newValue
     }
    }

    这里用法 Pattern 启用:

    • 更简洁的public API
    • 使类型更适合的public API: 我们希望"制作"是一个字符串,而不是 Property
    • value 是可选的,因为它必须适用于一般的适用性,但你的API可以能更正确。 当然,如果你的API想要一个可选的,那也不错。
    • 处理或者将原始JSON值转换为其他值的能力更适合于对象API的public
    • 可以以设置 Property.value,你可以以省略that属性的set访问器,同时帮助你为你的对象公开 API 。
    • 桥接 Pattern的这种用法使ModelRocket成为实现细节,并最小化依赖性和长期维护。

    实现类群集

    覆盖 modelForJSON(json: JSON) -> Model 函数

    classVehicle: Model {
     let make = Property<String>(key: "make")
     let model = Property<String>(key: "model")
     let year = Property<Int>(key: "year")
     let color = Property<UIColor>(key: "color")
     let manufacturer = Property<Manufacturer>(key: "manufacturer")
     overrideclassfuncmodelForJSON(json: JSON) -> Vehicle {
     switch json["type"].stringValue {
     case"car":returnCar(json: json)
     case"plane":returnPlane(json: json)
     case"bike":returnBike(json: json)
     default:returnVehicle(json: json)
     }
     }
    }

    然后,要访问子类特定属性,请使用切换案例

    let vehicle = Vehicle.modelForJSON(vehicleJSON)switch vehicle {caselet car as Car:// drive the carcaselet plane as Plane:// fly the planecaselet bike as Bike:// ride the bikedefault:// do nothing}

    获取对象表示的JSON

    调用模型子类上的json() 函数将返回包含以下内容的元组:

    • dictionary: [String : AnyObject]
    • json: JSON
    • data: NSData

    获取自定义对象的副本

    调用对象上的copy(),并强制转换为正确的类型。 例如:

    let vehicleCopy = vehicle.copy() as! Vehicle

    许可证

    ModelRocket是在MIT许可证下发布的。 详细信息请参阅许可证。



    文章标签:  BASE  framework  模式  Swift  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语