상속 한 웹 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 swift json". SwiftyJSON, 광택 등. – Mattias