Как преобразовать массив целых чисел смешанного размера в Swift

Свифт 5, iOS 14

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

var dindex = [Int8(1),Int16(2),Int32(3),Int64(4)] as [Any]

И я хочу преобразовать их в массив Doubles для обработки, например. Теперь карта не работает, и я не могу, кажется, просто пройтись по массиву, и мне не повезло с дженериками на данный момент...

// does not work
func convertMap(qindexIn qindexOut:[Int]) -> [Double] {
  return(qindexOut.map({ Double($0) }))
}

// does not work
func convertMap22(qindexIn qindexOut:[Any]) -> [Double] {
  let foo:[Double] = []
  for i in qindexOut {
    foo.append(Double(i))
  }
  return(foo)
}

// does not work
func convertMap2<T: BinaryInteger>(qindexIn qindexOut:[T]) -> [Double] {
  return(qindexOut.map({ Double($0) }))
}

// this doesn't work either
func convertMap22(qindexIn qindexOut:[Any]) -> [Int] {
  return(qindexOut.compactMap { $0 as? Int })
}

Действительно, код по большей части даже не компилируется. В чем здесь хитрость? Это точно возможно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
101
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это сработает. Я преобразовал Any в тип Int

 func convertMap22(qindexIn qindexOut:[Any]) -> [Double] {
     var foo:[Double] = []
     for i in qindexOut {
     if let intValue = i as? Int{
         let doubleValue = Double(intValue)
         foo.append(doubleValue)
     }else if let intValue = i as? Int8{
         let doubleValue = Double(intValue)
         foo.append(doubleValue)
     }else if let intValue = i as? Int16{
         let doubleValue = Double(intValue)
         foo.append(doubleValue)
     }else if let intValue = i as? Int32{
         let doubleValue = Double(intValue)
         foo.append(doubleValue)
     }else if let intValue = i as? Int64{
        let doubleValue = Double(intValue)
        foo.append(doubleValue)
    }
  }
  return(foo)
}

Я обновил ответ. Это будет работать, но я думаю, что решение Ooper лучше

abh 24.12.2020 14:31

Babar, это хорошая попытка, как говорится, решение ООПера выглядит очень объективно C'isn. Хотелось бы сделать это, не прибегая к NSNumber в идеальном мире.

user3069232 24.12.2020 14:34

@ user3069232, я согласен. Если будет опубликован еще один ответ Swifty, пожалуйста, не стесняйтесь одобрить его. Мне тоже интересно.

OOPer 24.12.2020 14:46

@OOPer, последовал твоему примеру и опубликовал ответ :)

user3069232 24.12.2020 15:41
Ответ принят как подходящий

Any в Swift действительно сложно работать.

Пожалуйста, попробуйте это:

func convertMap(qindexIn qindexOut:[Any]) -> [Double] {
    return(qindexOut.map{ ($0 as? NSNumber ?? NSNumber(0.0)).doubleValue })
}

Надеюсь, что могут быть какие-то лучшие способы.

Глядя на ответ OOPer, я понял, что это тоже работает, и, хотя он не более Swifty, возможно, он менее объективен.

func convertMap26(qindexIn qindexOut:[Any]) -> [Double] {
    return(qindexOut.map{ Double("\($0)") ?? 0.0 })
}

или просто compactMap { Double("\($0)") } это будет зависеть от того, следует ли преобразовать не число в ноль или пропустить

Leo Dabus 24.12.2020 15:51

Какая разница Лео? Возможно, compactMap быстрее?

user3069232 24.12.2020 15:54

Как я уже сказал, это зависит от того, хочет ли OP преобразовать «a» в ноль или просто пропустить его. В этом случае, когда все они являются числами, это не будет иметь значения, и карта, вероятно, будет быстрее.

Leo Dabus 24.12.2020 16:11

Другие вопросы по теме