Swift 5.2 - Словарь с массивом - Как правильно установить - PullRequest
0 голосов
/ 31 марта 2020

Я хочу попрактиковаться со словарем с массивами URL, как показано ниже:

import UIKit

var urlArray:[Int:[URL]] = [:]

for section in 1..<4 {
   self.urlArray[section, default: [URL]()] = [URL]()
   for index in 1..<10 {
      let urlString = "https://picsum.photos/id/\(index)/300/150"
      if let url = URL(string: urlString) {
        self.urlArray[section]?.append(url)
      }
   }
}

, но urlArray, после для l oop, как ноль. Как правильно установить словарь с массивом [Int: [URL]]?

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Заменить self.urlArray на urlArray - это две разные переменные.

0 голосов
/ 31 марта 2020

Я нашел решение. Спасибо всем.

import Foundation

var urlsArray : [Int:[URL]] = [:]

func rangeFor(section: Int) -> Range<Int> {
    switch section {
    case 1: return Range(100...105)
    case 2: return Range(300...306)
    case 3: return Range(400...412)
    case 4: return Range(500...505)
    case 5: return Range(600...612)
    case 6: return Range(700...710)
    case 7: return Range(800...815)
    default:
        fatalError()
    }
}

for section in 1..<8 {
    urlsArray[section] = [URL]()
    for index in rangeFor(section: section) {
        let urlString = "https://picsum.photos/id/\(index)/100/100"
        if let url = URL(string: urlString) {
            urlsArray[section]?.append(url)
        }
    }
}

//Stampa
for (section, urls) in urlsArray {
    print("Section: \(section)")
    for url in urls {
        print("url: \(url)")
    }
}

Мне не удалось разместить разделы в порядке возрастания.

0 голосов
/ 31 марта 2020

Как и предполагалось Yonat, я подозреваю, что проблема в том, что существуют локальные переменные и переменные экземпляра с именем urlArray. Локальным является тот, который вы назначаете ненулевое значение, но вы обращаетесь к переменной экземпляра, которая по-прежнему nil. Вы можете исправить это, удалив локальную переменную и просто ссылаясь исключительно на переменную экземпляра.

Я бы также рекомендовал использовать против таких имен, как "urlArray", вместо этого просто используйте форму множественного числа: urls, что приводит к некоторым действительно хороший синтаксис, такой как for url in urls { ...

В целом, я бы улучшил этот код, построив словарь в более «функциональном» стиле:

import Foundation

let items = (1..<4).flatMap { section in
    (1..<10).map { index -> (section: Int, url: URL) in
        return (section, URL(string: "https://picsum.photos/id/\(index)/300/150")!)
    }
}

let urlsBySection: [Int: [URL]] = Dictionary(grouping: items, by: { $0.section })
    .mapValues { pairs in pairs.map { $0.url } } // strip aways the sections

// Printing the results for demonstration:
for (section, urls) in urlsBySection {
    print("Section \(section)")
    for url in urls {
        print(" - \(url)")
    }
}

/* Result:
Section 2
 - https://picsum.photos/id/1/300/150
 - https://picsum.photos/id/2/300/150
 - https://picsum.photos/id/3/300/150
 - https://picsum.photos/id/4/300/150
 - https://picsum.photos/id/5/300/150
 - https://picsum.photos/id/6/300/150
 - https://picsum.photos/id/7/300/150
 - https://picsum.photos/id/8/300/150
 - https://picsum.photos/id/9/300/150
Section 3
 - https://picsum.photos/id/1/300/150
 - https://picsum.photos/id/2/300/150
 - https://picsum.photos/id/3/300/150
 - https://picsum.photos/id/4/300/150
 - https://picsum.photos/id/5/300/150
 - https://picsum.photos/id/6/300/150
 - https://picsum.photos/id/7/300/150
 - https://picsum.photos/id/8/300/150
 - https://picsum.photos/id/9/300/150
Section 1
 - https://picsum.photos/id/1/300/150
 - https://picsum.photos/id/2/300/150
 - https://picsum.photos/id/3/300/150
 - https://picsum.photos/id/4/300/150
 - https://picsum.photos/id/5/300/150
 - https://picsum.photos/id/6/300/150
 - https://picsum.photos/id/7/300/150
 - https://picsum.photos/id/8/300/150
 - https://picsum.photos/id/9/300/150
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...