私は継承したWeb APIフレームワークにエラー処理を追加しています。現時点では強制的なキャストが行われていますが、データが予期したものと一致しないとクラッシュする可能性があります。Swiftでジェネリック型チェック機能を使用できますか?
as!
のすべての用途をタイプをチェックし、失敗した場合に例外(詳細な説明付き)をスローする機能に置き換えたいと思います。
func checkType<T>(type: AnyClass, value: T?, name: String) throws -> T {
guard let value = value else {
let message = "[\(name)] Expected \(type), but value was nil"
throw PlaidsterError.InvalidType(message)
}
guard value.dynamicType.self == type else {
let message = "[\(name)] Expected \(type), but it was an \(value.dynamicType.self) with value: \(value)"
throw PlaidsterError.InvalidType(message)
}
return value
}
しかし、これは複数の問題があります。
これは私がする、これまでに得たものです。それはオブジェクト型だけを取ることができますが、クラスが正確に一致しない場合(たとえばNSStringが実際に__NSCFStringなので失敗した場合)、失敗します。つまり、String型、Int型、Double型のいずれでも動作しません...
Any
値型の同義語AnyClass
が見つかりません。これは最初の問題です。またtype
はタイプではないと言われているので、value.dynamicType.self is type
のようなことはできません。
それは私がやろうとしている何をすることは可能ですか?この種類の型チェックを行うには、解析コード全体に散らばった定型のコードがたくさんなくても良い方法がありますか?あなたは他のジェネリック型パラメータを指定して、このような何かを書くことができます
public struct PlaidCategory {
// MARK: Properties
public let id: String
public let hierarchy: [String]
public let type: String
// MARK: Initialization
public init(category: [String: Any]) throws {
id = try checkType(String.self, value: category["id"], name: "id")
hierarchy = try checkType([String].self, value: category["hierarchy"], name: "hierarchy")
type = try checkType(String.self, value: category["type"], name: "type")
}
}
私はあなたがgithubの上の多数の迅速なJSONパーサーの1を見て、あなたが何かを見つけることができるかどうかを確認示唆興味深い "github swift json"。 SwiftyJSON、光沢など。 – Mattias