如何在没有“可选”的情况下从 plist 打印字符串?
Posted
技术标签:
【中文标题】如何在没有“可选”的情况下从 plist 打印字符串?【英文标题】:How to print a string from plist without "Optional"? 【发布时间】:2014-10-28 03:01:38 【问题描述】:我从 plist 中的字典中加载一个值,但是当我将其打印到控制台时,它会打印:Optional(Monday Title) 而不仅仅是“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)
【问题讨论】:
试试这个 pod github.com/T-Pham/NoOptionalInterpolation。它正是这样做的。 【参考方案1】:摆脱Optional
的一种方法是使用感叹号:
println(todayTitle!)
但是,只有当您确定该值存在时,您才应该这样做。另一种方法是展开并使用条件,如下所示:
if let theTitle = todayTitle
println(theTitle)
将此程序粘贴到runswiftlang 以进行演示:
let todayTitle : String? = "today"
println(todayTitle)
println(todayTitle!)
if let theTitle = todayTitle
println(theTitle)
【讨论】:
太棒了!非常感谢您的快速回答。我仍然习惯于这些选项。 @vacawama 感谢您提醒我!看起来 runswiftlang 停止支持在线演示,所以我复制了重新键入的代码并将其粘贴到此处,并附有有关如何在线尝试 int 的说明。我还删除了问号。谢谢!【参考方案2】:经过一番尝试,我认为这种方式更好。
(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
【讨论】:
【参考方案3】:另一种更紧凑的方式(显然值得商榷,但它至少是一个单线)
(result["ip"] ?? "unavailable").description
。
理论上result["ip"] ?? "unavailable"
也应该有工作,但它没有,除非在 2.2 中
当然,将“不可用”替换为适合您的内容:“无”、“未找到”等
【讨论】:
聪明!正如@Jeremy 所指出的,您的默认值应该与您的可选值具有相同的类型。所以,如果你想打印一个可选的 Int:var i:Int?; print("i is: \((i ?? 0).description)") // output: "i is 0"
【参考方案4】:
我不确定链接到其他答案的正确流程是什么,但my answer to a similar question 也适用于此。
Valentin 的回答对于String?
类型的选项来说效果很好,但如果你想做类似的事情就不行了:
let i? = 88
print("The value of i is: \(i ?? "nil")") // Compiler error
【讨论】:
【参考方案5】:斯威夫特 3.1
从 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
【讨论】:
【参考方案6】:初始化
Var text: string? = nil
打印
print("my string", text! as string)
这将避免字符串前的“可选”字样。
【讨论】:
以上是关于如何在没有“可选”的情况下从 plist 打印字符串?的主要内容,如果未能解决你的问题,请参考以下文章
在没有打印预览或打开报表的情况下从 Access 中的表单打印报表?
编辑器或在没有 Xcode 的情况下以干净的方式打印 plist 的方法
JSON.NET:如何在没有数组的情况下从DataTable对象中仅序列化一行?