Конвертировать NSArray в Array в расширении в Swift - PullRequest
0 голосов
/ 02 апреля 2020

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

Входящий NSArray выглядит как

[@"Hello",@"Me",@"That",@"Me",@"Hello",@"Me",@"as",@"the"]

Вот различные версии расширения:

Эта версия создает допустимый массив, но, поскольку массив представляет собой NSArray, а не массив, происходит сбой на счетчиках строк [item] с ошибкой

не может индексировать значение типа '[String: Int]' с индексом типа 'Any'

public extension NSArray {
public var sortedArray: NSArray {
let array : NSArray = self
for item in array {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)

Следующий работает, но не принимает массив в качестве входных данных

public extension NSArray {
public var sortedArray: NSArray {
var array = ["Hello","Me","That","Me","Hello","Me","as","the"] 
for item in array {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)

Следующие два метода компилируются, но array2 и array3 остаются пустыми

public extension NSArray {
public var sortedArray: NSArray {
var array2: [String] = self.flatMap { $0 as? String } //This compiles but array is empty
var array3: [String] = self.compactMap({ $0 as? String }) //This compiles but 
for item in array2 {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)//prints 0 as the array is empty

Примечание: когда я вставляю точку останова в начале расширения, self является допустимый NSArray с большим количеством элементов.

Спасибо за любые предложения.

1 Ответ

1 голос
/ 02 апреля 2020

Стоит отметить, что мост NSArray стал очень хорошим в последних версиях swift. Например, все нижеприведенное работает

let array: NSArray = NSArray(array: [3, 2, 1])
print(array)
print(type(of: array))
let newArray = array.compactMap { $0 as? Int }.compactMap(UInt8.init)
print(newArray)

print(array.sorted(by: { (left, right) -> Bool in
    guard let left = left as? Int, let right = right as? Int else {
        return false
    }
    return left < right
}))

Я думаю, NSArray получает compactMap и друзей от соответствия протоколу Sequence. Поэтому стандартная библиотека делает все возможное, чтобы помочь вам здесь. Как упомянуто @Rob, вероятно, лучше работать с мостом, а не пытаться оставаться в NSArray -land

...