I'm looking for the best way to structure a class with a failable convenience initializer with optional parameters. Current code:
class Member: NSObject {
var uid: String
let avatarURL: NSURL
let created: NSDate
let email: String
let name: String
let provider: String
var posts = [Post]()
var comments = [Comment]()
// Initialize a member with raw data
init(uid: String, avatarURL: NSURL, created: NSDate, email: String, name: String, provider: String){
self.uid = uid
self.avatarURL = avatarURL
self.created = created
self.email = email
self.name = name
self.provider = provider
super.init()
}
convenience init?(snapshot: FDataSnapshot){
if let uid = snapshot.key {
if let avatarURLString = snapshot.value["avatarURL"] as? String {
if let avatarURL = NSURL(string: avatarURLString) {
if let memberCreated = snapshot.value["created"] as? NSDate {
if let memberEmail = snapshot.value["email"] as? String {
if let memberName = snapshot.value["name"] as? String {
if let memberProvider = snapshot.value["provider"] as? String {
self.init(uid: uid, avatarURL: avatarURL, created:memberCreated, email: memberEmail, name: memberName, provider: memberProvider)
}
}
}
}
}
}
}
return nil
}
}
I need to either initialize a member manually (init) or by passing a Firebase object (convenience init). If any of the optionals fail within the convenience init, I'd like it to fail.
Currently, it won't build because:
All stored properties of a class instance must be initialized before returning nil from an initializer
Not sure what I'm missing.
Any opinions about a better way to approach this are welcome.
guardstatement was really good improvement... - kelin