Swift1.2 结构体初始化函数编译报错
Swift1.2 compiler error in initialization function of structure
我有以下代码可以更轻松地处理 JSON。但是,我在调试和发布模式下遇到编译器错误:Command failed due to signal: Segmentation fault 11
。编译器明显编译失败的行是初始化方法的第一行。我还尝试了几种不同的方法(嵌套函数,首先将闭包分配给另一个变量等等)但是编译器无法让它工作。有没有什么办法解决这一问题?感谢您的帮助
enum JSONValue {
case JSONString(String)
case JSONNumber(Double)
case NIL(NilLiteralConvertible)
case JSONArray(Array<JSON>)
case JSONDictionary(Dictionary<String, JSON>)
}
struct JSON {
private let value: JSONValue
init(_ object: AnyObject?) {
value = { () -> JSONValue in
switch object {
case _ where object is String:
return .JSONString(object as! String)
case _ where object is NSNumber:
return .JSONNumber((object as! NSNumber).doubleValue)
case _ where object is Array<AnyObject>:
var array = [JSON]()
let original = object as! [AnyObject]
for item in original {
array += [JSON(item)]
}
return .JSONArray(array)
case _ where object is [String: AnyObject]:
var dictionary = [String: JSON]()
let original = object as! [String: AnyObject]
for item in original {
dictionary[item.0] = JSON(item.1)
}
return .JSONDictionary(dictionary)
default:
return .NIL(nil)
}
}()
}
var dictionaryKeyArray: [String] {
switch self.value {
case .JSONDictionary(let dictionary):
var result = [String]()
for item in dictionary.keys {
result.append(item)
}
return result
default:
fatalError("no dictionary")
}
}
var jsonArray: [JSON] {
switch self.value {
case .JSONArray(let array):
return array
default:
fatalError("no array")
}
}
var stringArray: [String] {
switch self.value {
case .JSONArray(let array):
var result = [String]()
for item in array {
result.append(item.stringValue)
}
return result
default:
fatalError("no string array")
}
}
var doubleValue: Double {
switch self.value {
case .JSONNumber(let double):
return double
default:
fatalError("no double value")
}
}
var intValue: Int {
switch self.value {
case .JSONNumber(let int):
return Int(int)
default:
fatalError("no integer value")
}
}
var stringValue: String {
switch self.value {
case .JSONString(let string):
return string
default:
fatalError("no string value")
}
}
var isNil: Bool {
switch self.value {
case .NIL(_):
return true
default:
return false
}
}
subscript(index: Int) -> JSON {
switch self.value {
case .JSONArray(let array) where array.count < index:
return array[index]
default:
return JSON(nil)
}
}
subscript(key: String) -> JSON {
switch self.value {
case .JSONDictionary(let dictionary) where dictionary[key] != nil:
return dictionary[key]!
default:
return JSON(nil)
}
}
}
编译器不应该出现segfault,不管源代码有多么错误,
这样您就可以在任何情况下向 Apple 提交错误报告。
但问题是定义
enum JSONValue {
// ...
case NIL(NilLiteralConvertible)
// ...
}
并不意味着JSONValue.NIL(nil)
是一个有效的枚举值。
符合NilLiteralConvertible
的类型是那些可以
初始化 nil
,例如可选值:
let opt : Int? = nil
所以 JSONValue.NIL(Optional<Int>(0))
将是一个有效的枚举值。但这可能不是你想要的。
我认为您应该将枚举定义为
enum JSONValue {
case JSONString(String)
case JSONNumber(Double)
case NIL // <- instead of NIL(NilLiteralConvertible)
case JSONArray(Array<JSON>)
case JSONDictionary(Dictionary<String, JSON>)
}
然后在您的代码中将 .NIL(nil)
替换为 .NIL
。至少它
确实使用此更改进行编译。
我有以下代码可以更轻松地处理 JSON。但是,我在调试和发布模式下遇到编译器错误:Command failed due to signal: Segmentation fault 11
。编译器明显编译失败的行是初始化方法的第一行。我还尝试了几种不同的方法(嵌套函数,首先将闭包分配给另一个变量等等)但是编译器无法让它工作。有没有什么办法解决这一问题?感谢您的帮助
enum JSONValue {
case JSONString(String)
case JSONNumber(Double)
case NIL(NilLiteralConvertible)
case JSONArray(Array<JSON>)
case JSONDictionary(Dictionary<String, JSON>)
}
struct JSON {
private let value: JSONValue
init(_ object: AnyObject?) {
value = { () -> JSONValue in
switch object {
case _ where object is String:
return .JSONString(object as! String)
case _ where object is NSNumber:
return .JSONNumber((object as! NSNumber).doubleValue)
case _ where object is Array<AnyObject>:
var array = [JSON]()
let original = object as! [AnyObject]
for item in original {
array += [JSON(item)]
}
return .JSONArray(array)
case _ where object is [String: AnyObject]:
var dictionary = [String: JSON]()
let original = object as! [String: AnyObject]
for item in original {
dictionary[item.0] = JSON(item.1)
}
return .JSONDictionary(dictionary)
default:
return .NIL(nil)
}
}()
}
var dictionaryKeyArray: [String] {
switch self.value {
case .JSONDictionary(let dictionary):
var result = [String]()
for item in dictionary.keys {
result.append(item)
}
return result
default:
fatalError("no dictionary")
}
}
var jsonArray: [JSON] {
switch self.value {
case .JSONArray(let array):
return array
default:
fatalError("no array")
}
}
var stringArray: [String] {
switch self.value {
case .JSONArray(let array):
var result = [String]()
for item in array {
result.append(item.stringValue)
}
return result
default:
fatalError("no string array")
}
}
var doubleValue: Double {
switch self.value {
case .JSONNumber(let double):
return double
default:
fatalError("no double value")
}
}
var intValue: Int {
switch self.value {
case .JSONNumber(let int):
return Int(int)
default:
fatalError("no integer value")
}
}
var stringValue: String {
switch self.value {
case .JSONString(let string):
return string
default:
fatalError("no string value")
}
}
var isNil: Bool {
switch self.value {
case .NIL(_):
return true
default:
return false
}
}
subscript(index: Int) -> JSON {
switch self.value {
case .JSONArray(let array) where array.count < index:
return array[index]
default:
return JSON(nil)
}
}
subscript(key: String) -> JSON {
switch self.value {
case .JSONDictionary(let dictionary) where dictionary[key] != nil:
return dictionary[key]!
default:
return JSON(nil)
}
}
}
编译器不应该出现segfault,不管源代码有多么错误, 这样您就可以在任何情况下向 Apple 提交错误报告。
但问题是定义
enum JSONValue {
// ...
case NIL(NilLiteralConvertible)
// ...
}
并不意味着JSONValue.NIL(nil)
是一个有效的枚举值。
符合NilLiteralConvertible
的类型是那些可以
初始化 nil
,例如可选值:
let opt : Int? = nil
所以 JSONValue.NIL(Optional<Int>(0))
将是一个有效的枚举值。但这可能不是你想要的。
我认为您应该将枚举定义为
enum JSONValue {
case JSONString(String)
case JSONNumber(Double)
case NIL // <- instead of NIL(NilLiteralConvertible)
case JSONArray(Array<JSON>)
case JSONDictionary(Dictionary<String, JSON>)
}
然后在您的代码中将 .NIL(nil)
替换为 .NIL
。至少它
确实使用此更改进行编译。