带换行符的 NSTextField 字符串

NSTextField string with newlines

我有一系列带有可选 "comment" 字段的对象,其中包含一个字符串。我想提取所有评论并将它们列为 NSTextField(或任何其他合适的视图)中的单独行。所以我这样做了...

@IBOutlet var CommentsTextView: NSTextView!

func CommentsInitialize() {
    var cmt = ""
    for c in document!.commentCards {
        cmt += c.info["comment"] ?? "" + "\n"
    }
    CommentsTextView.string = cmt
}

文本出现,但作为所有一行 运行 在一起。根据 this 它应该可以正常工作,但换行符根本没有做任何事情(我尝试了 \n、\r\n 和 \r)。我错过了一些明显的东西吗?我可以在 IB 中看到 TextStorage 中有换行模式的设置,但我似乎无法设置它,更改值没有任何作用。

p.s。如果您想知道丢失的 "weak",那显然是一个老问题 Cocoa - 那里的弱者被释放并死亡

问题在于 nil 合并运算符 ?? 的优先级 (131) 低于 + 运算符 (140),因此该行:

cmt += c.info["comment"] ?? "" + "\n"

将被评估为

cmt += c.info["comment"] ?? ("" + "\n")

随后,换行转义符"\n"将被添加到cmt只有当c.info["comment"]包含nil时

如果用以下内容替换该行

cmt += (c.info["comment"] ?? "") + "\n"                  // (+)

然后也会为 c.info["comment"] 为 non-nil 的情况添加换行符。


现在,上面的固定过程 (+) 也会为空的 ("") 以及 nil-valued 注释字段添加换行符,并且还会在最后一个之后添加最后一个换行符评论区内容。如果您只想为实际存在的评论添加换行符(不是 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))