问题
I'm trying to manage a variable like this:
var isFinished: Bool {
get {
return NSUserDefaults.standardUserDefaults().boolForKey("isFinished")
}
set {
NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "isFinished")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
This works, however, I'm trying to make it more safe by using an if let
when getting:
var isFinished: Bool {
get {
if let isFinished = NSUserDefaults.standardUserDefaults().boolForKey("isFinished") as? Bool {
return isFinished
}
}
set {
NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "isFinished")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
This will give a yellow error though: "Conditional cast from 'Bool' to 'Bool' always succeeds."
Alright then:
if let isFinished = NSUserDefaults.standardUserDefaults().boolForKey("isFinished") {
return isFinished
}
Now it's worse: "Initializer for conditional binding must have Optional type, not 'Bool'"
What's the correct way of handling this?
回答1:
Your primary approach is fine.
boolForKey
of NSUserDefaults
doesn't return an optional therefore any optional binding attempt is meaningless.
func boolForKey(_ aKey: String) -> Bool
If a Boolean value is associated with the specified key, that value is returned. If the key was not found, this method returns NO.
回答2:
You need to write in this way :-
if let isFinished : Bool = NSUserDefaults.standardUserDefaults().boolForKey("isFinished")
{
return isFinished
}
Hope this will help you :)
来源:https://stackoverflow.com/questions/35668986/if-let-clause-when-getting-from-nsuserdefaults