Ios Swift中初始化失败的处理

Ios Swift中初始化失败的处理,ios,swift,initialization,init,Ios,Swift,Initialization,Init,我有一个自定义类,我想使用JSONCoable从JSON对象初始化它 所以我有 public var id: String public var name: String? public var imageURL: NSURL? 以及符合JSONCABLE协议的可故障初始化器 required public init?(JSONDictionary: JSONObject) { let decoder = JSONDecoder(object: JSONDictiona

我有一个自定义类,我想使用JSONCoable从JSON对象初始化它

所以我有

public var id: String    
public var name: String?
public var imageURL: NSURL?
以及符合JSONCABLE协议的可故障初始化器

required public init?(JSONDictionary: JSONObject) {
        let decoder = JSONDecoder(object: JSONDictionary)
        do {
            id = try decoder.decode("id")
            name =  try decoder.decode("name")
            if  let imageURLString: String = try decoder.decode("image") {
                imageURL = NSURL(string: imageURLString)
            }
        }
        catch let error as NSError{
            NSLog("\(error.localizedDescription)")
            return nil
        }
    }
“Return nil”语句出现编译器错误: 在从初始化器返回nil之前,必须初始化类实例的所有存储属性。 除了设置虚拟值之外,还有其他方法可以解决这个问题吗?我想包括的属性之一是只读的,我真的不想仅仅为了绕过编译器而创建setter。 我使用的是一个类,而不是JSONCABLED示例代码中的结构,因为我想要子类化。 一种可能性是有一个不会出错的初始化器,它会抛出一个错误,但这不符合JSONCABLE协议。
我是Swift的新手,任何关于如何处理这个问题的建议都是非常受欢迎的

在这个答案的帮助下修复:(这里提到)

所以现在我有了

 public var id: String!

id现在隐式展开,因此其默认值为nil

在这个答案的帮助下修复:(这里提到)

所以现在我有了

 public var id: String!

id现在隐式展开,因此其默认值为nil

如果您只有一个属性要检查(根据您的设计名称和imageURL在类中可以是
nil
),我将在调用初始值设定项之前提取
id
,并声明初始值设定项不可失败。它必须能够失败,以符合JSONCABLE协议。另外,这个例子只是一个概念证明-我有很多其他属性要添加。在这种情况下,您必须为所有非可选属性指定一个默认值,例如
id
属性的空字符串,如果您只有一个属性要检查(根据您的设计名称和imageURL,类中可以
nil
)在调用初始值设定项之前,我将提取
id
,并声明初始值设定项不可失败。它必须是可失败的,以符合JSONCABLE协议。另外,这个示例只是一个概念证明-我有很多其他属性要添加。在这种情况下,您必须为所有非可选属性指定一个默认值,例如
id
属性的空字符串