Как я могу разбить массив на указанные строки при печати?

#swift #xcode #dictionary

#swift #xcode #словарь

Вопрос:

Новичок в разработке программного обеспечения, я работаю над книгой Big Nerd Ranch «Swift Programming». Одна из задач, поставленных в книге, состоит в том, чтобы напечатать массив в словаре, который содержит 15 почтовых индексов, и разделить их на три строки группами по пять. Форматирование должно точно соответствовать тому, как оно отображается в книге.

Я попытался решить проблему, используя информацию, изложенную в книге, с помощью документации разработчика.

Нет кубиков.

Это то, что мне нужно распечатать:

 Caterham has the following zip codes: [111, 111, 111, 111, 111,
                                       222, 222, 222, 222, 222,
                                       333, 333, 333, 333, 333]
  

Однако это самое близкое, что я могу получить…

 var areaCodes = ["Caterham": [111, 111, 111, 111, 111], "Coulsdon": [222, 222, 222, 222, 222], "Purley": [333, 333, 333, 333, 333]]

var caterhamCodes : [Int] = []

for (_, values) in areaCodes {
    caterhamCodes  = values
}

print("Caterham has the following codes: (caterhamCodes[0...4]),")
print("                                  (caterhamCodes[5...9]),")
print("                                  (caterhamCodes[10...14]).")
  

который печатает:

 Caterham has the following postcodes: [111, 111, 111, 111, 111],
                                      [222, 222, 222, 222, 222],
                                      [333, 333, 333, 333, 333].
  

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

Я ценю, что это, вероятно, вопрос высокого уровня с простым ответом, но я всего несколько недель изучаю, поэтому я надеюсь, что меня можно простить за то, что я задаю хотя бы несколько глупых вопросов!

Комментарии:

1. Не [222, 222, 222, 222, 222] связаны с "Coulsdon" ?

2. Возможно, если вы перечитаете Silver Challenge , то потребуется форматирование всех значений в словаре, чтобы он не переполнялся…

Ответ №1:

Добро пожаловать в сообщество разработчиков и приятного пребывания! Я пытаюсь ответить как можно проще, поэтому вот моя попытка:

 var areaCodes = ["Caterham": [111, 111, 111, 111, 111],
                 "Coulsdon": [222, 222, 222, 222, 222],
                 "Purley": [333, 333, 333, 333, 333]]
let codesArray = areaCodes.values.sorted(by: { $0[0] < $1[0] })
let caterhamString = "Caterham has the following zip codes: ["
var printString = caterhamString

for (index, area) in codesArray.enumerated() {
   for code in area {
      printString  = "(code), "
   }

   if index != codesArray.count - 1 {
      printString  = "n"   String(repeating: " ", count: caterhamString.count)
   }
}

print(printString.dropLast(2).appending("]"))
  

Надеюсь, это поможет! Удачи!

Ответ №2:

Вот способ получения желаемого результата :

 let intro = "Caterham has the following zip codes: ["
let spaces = ",n"   String(repeating: " ", count: intro.count)

let areaCodes = ["Caterham": [111, 111, 111, 111, 111], "Coulsdon": [222, 222, 222, 222, 222], "Purley": [333, 333, 333, 333, 333]]

let codes = areaCodes.values.sorted { $0[0] < $1[0] }

var output = intro  
    codes.map { $0.map{ String($0) }.joined(separator: ", ") }
    .joined(separator: spaces)
      "]"

print(output)
  

Который печатает

 Caterham has the following zip codes: [111, 111, 111, 111, 111,
                                       222, 222, 222, 222, 222,
                                       333, 333, 333, 333, 333]