我有一系列带有可选“注释”字段的对象,其中包含一个字符串。我想提取所有注释并将它们列为NSTextField(或任何其他合适的视图)中的单独行。所以我这样做了......
@IBOutlet var CommentsTextView: NSTextView!
func CommentsInitialize() {
var cmt = ""
for c in document!.commentCards {
cmt += c.info["comment"] ?? "" + "\n"
}
CommentsTextView.string = cmt
}
显示文字,但所有一行都在一起运行。根据{{3}},它应该可以工作,但新行只是没有做任何事情(我试过\ n,\ r \ n和\ r)。我错过了一些明显的东西吗我可以在IB中看到TextStorage中有换行模式的设置,但我似乎无法设置它,更改值什么都不做。
P.S。如果你想知道失踪的“弱者”,显然这是一个古老的可可问题 - 那里的弱者释放并死亡
答案 0 :(得分:2)
问题是nil合并运算符??
的优先级(131
)低于+
运算符(140
),因此行:
cmt += c.info["comment"] ?? "" + "\n"
将被评估为
cmt += c.info["comment"] ?? ("" + "\n")
随后,仅当"\n"
包含nil时,换行符cmt
才会添加到c.info["comment"]
。
如果用以下
替换该行cmt += (c.info["comment"] ?? "") + "\n" // (+)
然后,对于c.info["comment"]
非零的情况,也会添加换行符。
现在,上面的固定过程(+)
还会为空(""
)以及零值注释字段添加换行符,并且还会在最后一个注释字段内容之后添加最后一个换行符。如果您只想为实际现有注释添加换行符(不是nil
也不是空),您可以使用if let
可选绑定而不是nil合并运算符:
if let str = c.info["comment"] where str.characters.count > 0 {
cmt += str + "\n"
}
/* remove last trailing '\n' */
cmt.removeAtIndex(cmt.endIndex.advancedBy(-1))