29. Optional<T>をValueTypeで拡張
public protocol ValueType {
static func fromJSON(json: AnyObject?) -> Self?
func toJSON() -> AnyObject?
}
extension Optional: ValueType {
public static func fromJSON(json: AnyObject?) -> Wrapped?? {
guard let valueType = Wrapped.self as? ValueType.Type,
let value = valueType.fromJSON(json),
let wrapped = value as? Wrapped else {
return .Some(.None)
}
return .Some(.Some(wrapped))
}
public func toJSON() -> AnyObject? {
switch self {
case .Some(let wrapped):
guard let value = wrapped as? ValueType else {
return nil
}
return value.toJSON()
case .None:
return nil
}
}
}
30. どういうこと?
static func fromJSON
let optionalInt = Int?.fromJSON(json: 1)
print(optionalInt) // -> Optional<Optional(1)>
if let unwrappedOptinalInt = optionalInt {
print(unwrappedOptionalInt) // -> Optional(1)
}
?上記のコードはOptional<Int>へのスタティックメソッド呼び出し
?fromJSONはSelf?を返すので、optionalIntの型はOptional<Optional<Int>>になる
func toJSON(instance func)
let json = optionalInt.toJSON()
?Optional<Int>に追加されたtoJSONを呼び出している
31. Propertyクラスで行われていること
public class Property<Value: ValueType>: PropertyType {
public var value: Value
public func fromJSON(json: AnyObject) {
// ...NSNullの処理
if let value = Value.fromJSON(json) { // <- ここ
self.value = value
}
}
public func toJSON() -> AnyObject? {
if let json = value.toJSON() {
return json
}
// ...NSNullの処理
return nil
}
}