Plistのディクショナリから値をロードしますが、コンソールに出力すると、「Monday Title」だけでなく、Optional(Monday Title)が出力されます。
印刷時に値のOptional()を取り除くにはどうすればよいですか?
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)
}
}
Optional
を取り除く1つの方法は、感嘆符を使用することです。
println(todayTitle!)
ただし、値が存在することが確実な場合にのみ、それを行う必要があります。別の方法は、次のようにアンラップして条件を使用することです。
if let theTitle = todayTitle {
println(theTitle)
}
このプログラムを runswiftlang に貼り付けてデモを行います。
let todayTitle : String? = "today"
println(todayTitle)
println(todayTitle!)
if let theTitle = todayTitle {
println(theTitle)
}
少し試してみると、この方法の方が良いと思います。
(variableName ?? "default value")!
デフォルト値には??
を使用し、オプション変数のラップ解除には!
を使用します。
ここに例があります
var a:String? = nil
var b:String? = "Hello"
print("varA = \( (a ?? "variable A is nil.")! )")
print("varB = \( (b ?? "variable B is nil.")! )")
印刷されます
varA = variable A is nil.
varB = Hello
別の、もう少しコンパクトな方法(明らかに議論の余地がありますが、少なくとも1つのライナーです)
(result["ip"] ?? "unavailable").description
。
理論的には result["ip"] ?? "unavailable"
も機能するはずですが、2.2でない限り機能しません。
もちろん、「利用不可」を「nil」、「not found」など、あなたに合ったものに置き換えてください。
他の回答にリンクするための適切なプロセスが何であるかはわかりませんが、 同様の質問に対する私の回答 がここにも適用されます。
バレンティンの答えは、タイプString?
のオプションに対して十分に機能しますが、次のようなことをしたい場合は機能しません。
let i? = 88
print("The value of i is: \(i ?? "nil")") // Compiler error
Swift 3から、String(describing:)
を使用してオプションの値を出力できますが、構文は非常に難しく、結果はコンソールログで簡単に確認できません。
Optional
の拡張を作成して、一貫したnil
値を作成します。
extension Optional {
var logable: Any {
switch self {
case .none:
return "⁉️" // Change you whatever you want
case let .some(value):
return value
}
}
}
使い方:
var a, b: Int?
a = nil
b = 1000
print("a: ", a.logable)
print("b: ", b.logable)
結果:
a: ⁉️
b: 1000