2016-01-26 4 views
0

У меня есть серия объектов с необязательным полем «комментарий», которое содержит строку. Я хотел бы извлечь все комментарии и перечислить их как отдельные строки в NSTextField (или любое другое подходящее представление). Так что я сделал это ...NSTextField string with newlines

@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. Если вы задаетесь вопросом о недостающей «слабой», то, по-видимому, это старая проблема с какао - со слабым там, где она была выпущена и умерла

ответ

2

Проблема заключается в том, что оператор коалесцирования nil ?? имеет более низкий приоритет (131), чем + оператор (140), следовательно, линия:

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

будет оценен как

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

Впоследствии линия побег перерыва характер "\n" будет добавляется к cmt, только если c.info["comment"] содержит ноль.

Если вы замените строку со следующим

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

затем разрывы строк будут добавлены также для случаев, когда c.info["comment"] отлична от нуля.


Теперь неподвижная процедура (+) выше добавит разрывы строк и для пустой (""), а также с нулевыми значениями поля комментариев, а также один окончательный разрыв строки после того, как содержание последнего комментария поля. Если вы хотите только добавить разрывы строк только для реальных существующих комментариев (не nil ни пустых), вы могли бы использовать if let опциональное связывание, а не нулевой оператора коалесцирующема:

if let str = c.info["comment"] where str.characters.count > 0 { 
    cmt += str + "\n" 
} 

/* remove last trailing '\n' */ 
cmt.removeAtIndex(cmt.endIndex.advancedBy(-1)) 
+0

Ого. Я был уверен, что это как-то связано с NSTextField, я никогда не думал, что это связано с самой строкой. Спасибо, dfri! –

+0

@MauryMarkowitz Счастливые помочь! Просто примечание: это не строка, как таковая, а скорее приоритет операторов, который не ограничивается экземплярами 'String'. В этом случае у этих реализаций есть экземпляры 'String', но вы бы видели такое же поведение, например, попытку разворачивания и последующее добавление' 10' к некоторому необязательному 'Int' (т. Е.' MyInt = myOptionalInt? ? 0 + 10' эквивалентно 'myInt = myOptionalInt ?? (0 + 10)' <- '10 'добавляется только в том случае, если' myOptionalInt' - 'nil'). – dfri