Я пытаюсь создать функцию, которая сохраняет заголовок и ссылку на веб-сайт

Это то, что я пытаюсь сохранить

[0] -> [TITLE, LINK]
[1] -> [TITLE, LINK]
[2] -> [TITLE, LINK]

Вот как я это делаю

//Create array
var favoriteProducts = [[String:String]]()
                            
//Add products
let firstArray = [titleName:String(), link:String()]

favoriteProducts.append(firstArray)
                            
//Add to defaults
UserDefaults.standard.set(favoriteProducts, forKey: "favProducts")

Следующим шагом будет цикл с использованием ForEach для возврата заголовка и ссылки. Для отладки пытаюсь использовать

UserDefaults.standard.array(forKey: "favProducts")![0][0]

Что возвращается

Value of type 'Any' has no subscripts

Однако

UserDefaults.standard.array(forKey: "favProducts")![0]

Возврат

(website, link)

Итак, мой вопрос: как мне вернуть и веб-сайт, и ссылку по отдельности, а не только весь индекс?

1
idris 25 Ноя 2021 в 07:29
Возможно, вы захотите узнать разницу между массивом и Словарь. Для краткости [] - это Array, а [ : ] - Dictionary
 – 
Ricky Mo
25 Ноя 2021 в 07:53

2 ответа

Лучший ответ

Вы можете хранить arrayOfStrings в массиве структуры и иметь доступ к долине из структуры, скажем, пример

    var favouriteProducts = [[String:Any]]()
    var listOfSite = [SiteDetail]()
    
    var firstArray = ["titleName":"String","link":"firstlink"]
    var secondArray = ["titleName":"s","link":"s"]
    
    favouriteProducts.append(firstArray)
    favouriteProducts.append(secondArray)
    UserDefaults.standard.set(favouriteProducts, forKey: "favProducts")
    
    let value = UserDefaults.standard.array(forKey: "favProducts") as? [[String:String]] ?? [[:]]
    
    for values in value{
        let siteName = values["titleName"] as? String ?? ""
        let link = values["link"] as? String ?? ""
        let siteDetail = SiteDetail(website: siteName, link: link)
        listOfSite.append(siteDetail)
    }
    
    print("listOf \(listOfSite[0].link)")
    print("listOf \(listOfSite[0].website)")

 //////////////////////////

  struct SiteDetail{
    var website:String?
    var link:String?
  }
1
Gowtham 25 Ноя 2021 в 08:33
@ user302975, Будет выше Помогает
 – 
Gowtham
25 Ноя 2021 в 08:39

Здесь UserDefaults.standard.array возвращает массив типа Any, а вы сохраняете массив словаря. Итак, во время получения вам нужно преобразовать элемент массива в словарь.

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

let firstElement = (UserDefaults.standard.array(forKey: "favProducts")?[0] as? [String: String])
let title = firstElement?["titleName"]
let link = firstElement?["link"]
0
Raja Kishan 25 Ноя 2021 в 07:49
Var favavouriteProducts = [[String: String]] () не является двумерным массивом. это просто набор словарей. Вы получаете указанную выше ошибку только из-за этого
 – 
Gavidi Harikrishna
25 Ноя 2021 в 07:54
Спасибо, что указали на это. Да, здесь не совпадают заголовок и пост.
 – 
Raja Kishan
25 Ноя 2021 в 08:07
Использование вышеуказанного метода возвращает nil
 – 
user302975
25 Ноя 2021 в 08:21
Не могли бы вы сначала исправить свой пост? Прочтите комментарий к публикации и ответьте на комментарий.
 – 
Raja Kishan
25 Ноя 2021 в 08:25
Я обновил его тем, чего я пытаюсь достичь @RajaKishan
 – 
user302975
25 Ноя 2021 в 08:27