带协议的动态初始化器
Dynamic initializer with protocol
我正在与 Alamofire
和 SwiftyJSON
合作。我想为常见情况构建一般请求和解析模型。首先,我制定了一个名为 JSONConvertible
.
的协议
protocol JSONConvertible {
init?(json: JSON)
}
其次,我在 Alamofire
.
中扩展 Request
class
extension Request {
func getResult(format: [String: AnyClass]) {
self.responseJSON { (response) in
guard let statusCode = response.response?.statusCode else {
return
}
switch statusCode {
case 200:
var result = [String: AnyObject]()
let json = JSON(rawValue: response.result.value!)!
for (key, className) in format {
if className.self is JSONConvertible {
let value = className.self(json: json[key]) // get error in this line
}
}
case 201..<400:
break
case 400...Int.max:
break
default:
break
}
}
}
}
但是我从编译器中得到一个错误。因为 AnyObject 只是协议,它没有这个初始化器。我不想只获取字典或数组。我想获得具有具体 class 的实例。请帮我。非常感谢!
那是因为在 if
中 className.self
的类型仍然是 AnyObject
。您需要将其转换为 JSONConvertible
,然后才能使用初始化程序。
if let concreteClass = className.self as? JSONConvertible.Type
{
let value = concreteClass.init(json: json[key])
}
如果您熟悉 kotlin,swift 在测试 if
子句中的类型时不会自动进行转换。
我找到了另一种方法来解决这个问题。定义新协议。
protocol JSONConvertibleObject: AnyObject, JSONConvertible {
}
并改用它。
extension Request {
func getResult(format: [String: JSONConvertibleObject]) {
self.responseJSON { (response) in
guard let statusCode = response.response?.statusCode else {
return
}
switch statusCode {
case 200:
var result = [String: AnyObject]()
let json = JSON(rawValue: response.result.value!)!
for (key, className) in format {
let value = className.self.dynamicType.init(json: json[key])
}
case 201..<400:
break
case 400...Int.max:
break
default:
break
}
}
}
}
我正在与 Alamofire
和 SwiftyJSON
合作。我想为常见情况构建一般请求和解析模型。首先,我制定了一个名为 JSONConvertible
.
protocol JSONConvertible {
init?(json: JSON)
}
其次,我在 Alamofire
.
Request
class
extension Request {
func getResult(format: [String: AnyClass]) {
self.responseJSON { (response) in
guard let statusCode = response.response?.statusCode else {
return
}
switch statusCode {
case 200:
var result = [String: AnyObject]()
let json = JSON(rawValue: response.result.value!)!
for (key, className) in format {
if className.self is JSONConvertible {
let value = className.self(json: json[key]) // get error in this line
}
}
case 201..<400:
break
case 400...Int.max:
break
default:
break
}
}
}
}
但是我从编译器中得到一个错误。因为 AnyObject 只是协议,它没有这个初始化器。我不想只获取字典或数组。我想获得具有具体 class 的实例。请帮我。非常感谢!
那是因为在 if
中 className.self
的类型仍然是 AnyObject
。您需要将其转换为 JSONConvertible
,然后才能使用初始化程序。
if let concreteClass = className.self as? JSONConvertible.Type
{
let value = concreteClass.init(json: json[key])
}
如果您熟悉 kotlin,swift 在测试 if
子句中的类型时不会自动进行转换。
我找到了另一种方法来解决这个问题。定义新协议。
protocol JSONConvertibleObject: AnyObject, JSONConvertible {
}
并改用它。
extension Request {
func getResult(format: [String: JSONConvertibleObject]) {
self.responseJSON { (response) in
guard let statusCode = response.response?.statusCode else {
return
}
switch statusCode {
case 200:
var result = [String: AnyObject]()
let json = JSON(rawValue: response.result.value!)!
for (key, className) in format {
let value = className.self.dynamicType.init(json: json[key])
}
case 201..<400:
break
case 400...Int.max:
break
default:
break
}
}
}
}