Подставление значений в тексте


#1

У меня в приложении пользователю задаются определенные вопросы, он отвечает, эти ответы сохраняются в приложении. Потом далее в приложении будет предоставлен рассказ для чтения, и в нем нужно вставить ответы пользователя (1-3 слова)
Например предварительно у пользователя узнали любимый цвет или продукт (он набрал в textField - мы сохранили ответ в массив под определённым ключом). Потом уже в самом рассказе его ответ должен вставиться в нужных местах.
Пока у меня только такая идея:
let answer = "зеленый"
потом далее
var textBlock1 = "Жили-были дед и баба, и был у них"
var textBlock2 = "кадилак, на котором они ездили за репкой"
И потом просто сложить Label.text = textBlock1+answer+textBlock2


#2

Хорошая история)

let colorKey = "%colorKey%"
let targetKey = "%targetKey%"

let color = "зеленый"
let target = "бананами"

var textBlock = "Жили-были дед и баба, и был у них \(colorKey) кадилак, на котором они ездили за \(targetKey)."

textBlock = textBlock.replacingOccurrences(of: colorKey, with: color)
textBlock = textBlock.replacingOccurrences(of: targetKey, with: target)

print(textBlock)

#3

Спасибо!
Выглядит так просто, не знал о такой команде
Я попробую сделать


#4

У меня новая проблема с подставлением значений в тексте
Если сам текст рассказа набирается прямо в коде, то никаких проблем с командой .replacingOccurrences, все отрабатывает корректно
Но текст у меня большой и хранится в plist-файле, из которого происходит загрузка. Я прямо в этом файле в тексте сразу вставил (colorKey), но никакого подставления значения программа не делает. Я подозреваю, что программа не производит “чтение” этого текста при подставления значения, и поэтому она “не видит” внутри (colorKey). Что можно тогда сделать?


#5

Это сильно зависит от того, куда ты этот текст читаешь.


#6

текст хранится в Array в виде текстовых блоков, ниже пример кода
Он потом подставляется в Label. Для проверки проверял текст через print - он никак не поменялся

let heroNameKey = “%heroNameKey%”
someText = chapterText[pageNumber]
let heroNameString = “Batman”
pageText = someText.replacingOccurrences(of: heroNameKey, with: heroNameString)


#7

Видимо, ты в другом месте накосячил. Приложи проект зипом или образец где нет секретных данных.


#8

текст в plist копировался кстати из word файла, написанном в Windows… текст на русском - из-за шрифта может программа “не читает” текст?
попробую похожую минипрограммку сделать, для проверки… потом закину сюда если не найду выхода


#9

Перед тем как тратить время проверь выбранную кодировку в ворде. А также, проверь чтобы не было rich text.


#10

А какая нужна кодировка в Ворде, чтобы XCode “понимал” его корректно?
что такое rich text??


#11

А можно для начала увидеть кусок текста из plist файла с вставленными маркерами?


#12

Загугли rich text, plain text, utf-8, utf-16, text encoding.


#13

погуглил, но пока безрезультатно, понял только что Xcode лучше понимает HTML и UTF-8 (16). Попробовал через Блокнот пересохранить в UTF кодировке. Потом оттуда перекопировал в plist - ничего не поменялось…
ПРобовал еще такой вариант

let heroNameKey = “%heroNameKey%”
someText = chapterText[pageNumber]
let cString = someText.cString(using: .utf8)!
let heroNameString = “Amiko”
pageText = cString.replacingOccurrences(of: heroNameKey, with: heroNameString)
print(pageText)

Но тут cString получается как [CChar] у которого нет команды replacingOccurrences
Может есть другой способ перекодировки?


#14

Покажите пожалуйста кусок текста из plist файла с вставленным маркером.


#15

Вот например кусок текста:

heroNameKey, я вижу по нашей программе (heroNameKey) уже получил 5 за 1 день. Поздравляю! Неплохое начало, но это еще не всё – впереди тебя ждут еще много новых испытаний и приключений. И если ты пройдешь все испытания и получишь все медали – ты сможешь …

Тут в тексте я уже пробовал разные варианты прописания маркера


#16

Как я и предполагал с самого начала ))))))
В тексте нужно вставлять сам маркер, а не его переменную из кода, т.е. %heroNameKey% вместо heroNameKey
И все у вас заработает без кодировок, с любым языком.


#17

Точно!! -))
Все получилось без всяких перекодировок. Причем я просто убрал эти значки %% при объявлении heroNameKey - и в тексте все стало нормально.
Я думал эти значки нужны по синтаксису для подставления.
Спасибо!-)


#18

Я имел в виду немного наоборот. Значки эти как раз в тексте и нужны, что бы в тексте проще было видно маркеры.
В тексте должно быть так:

%heroNameKey%, я вижу по нашей программе (%heroNameKey%) уже получил 5 за 1 день. Поздравляю! Неплохое начало, но это еще не всё – впереди тебя ждут еще много новых испытаний и приключений. И если ты пройдешь все испытания и получишь все медали – ты сможешь …

В коде так:

let heroNameKey = “%heroNameKey%”
someText = chapterText[pageNumber]
let heroNameString = “Batman”
pageText = someText.replacingOccurrences(of: heroNameKey, with: heroNameString)

И это не обязательно должны быть значки %. Тут может быть что угодно. Главное придумать такую комбинацию для маркера, что бы он никогда не смог совпасть с каким либо нужным текстом.


#19

привет, ты писал, что “в текстфилде текст не бывает nil, даже если ты присваиваешь ему nil, он будет “”. Пользуйся деббагером и смотри что находится в переменных.”

Ну вот смотри, я опять наткнулся на похожую ситуацию и решил проверить, как ты сказал - посмотреть значение через дебагер. И он показывает nil.


#20

Ты определись где nil, textField == nil или textField.text == nil ?