可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I load a value from a dictionary in a plist but when I print it to the console, it prints: Optional(Monday Title) rather than just "Monday Title".
How can I get rid of the Optional() of my value when printing?
var plistPath = NSBundle.mainBundle().pathForResource("days", ofType: "plist")
var plistArray = NSArray(contentsOfFile: plistPath!) as NSArray!
for obj: AnyObject in plistArray {
if var dicInfo = obj as? NSDictionary {
let todayTitle: AnyObject? = dicInfo.valueForKey("Title")
println(todayTitle)
}
}
回答1:
One way to get rid of the Optional
is to use an exclamation point:
println(todayTitle!)
However, you should do it only if you are certain that the value is there. Another way is to unwrap and use a conditional, like this:
if let theTitle = todayTitle {
println(theTitle)
}
Paste this program into runswiftlang for a demo:
let todayTitle : String? = "today"
println(todayTitle)
println(todayTitle!)
if let theTitle = todayTitle {
println(theTitle)
}
回答2:
With some try, I think this way is better.
(variableName ?? "default value")!
Use ??
for default value and then use !
for unwrap optional variable.
Here is example,
var a:String? = nil
var b:String? = "Hello"
print("varA = \( (a ?? "variable A is nil.")! )")
print("varB = \( (b ?? "variable B is nil.")! )")
It will print
varA = variable A is nil.
varB = Hello
回答3:
Another, slightly more compact, way (clearly debatable, but it's at least a single liner)
(result["ip"] ?? "unavailable").description
.
In theory result["ip"] ?? "unavailable"
should have work too, but it doesn't, unless in 2.2
Of course, replace "unavailable" with whatever suits you: "nil", "not found" etc
回答4:
I'm not sure what the proper process is for linking to other answers, but my answer to a similar question applies here as well.
Valentin's answer works well enough for optionals of type String?
, but won't work if you want to do something like:
let i? = 88
print("The value of i is: \(i ?? "nil")") // Compiler error
回答5:
Swift 3.1
From Swift 3, you can use String(describing:)
to print out optional value. But the syntax is quite suck and the result isn't easy to see in console log.
So that I create a extension of Optional
to make a consistent nil
value.
extension Optional {
var logable: Any {
switch self {
case .none:
return "⁉️" // Change you whatever you want
case let .some(value):
return value
}
}
}
How to use:
var a, b: Int?
a = nil
b = 1000
print("a: ", a.logable)
print("b: ", b.logable)
Result:
a: ⁉️
b: 1000
回答6:
initialize
Var text: string? = nil
Printing
print("my string", text! as string)
This will avoid word "optional" before the string.