<= Операнд запрашивает ожидаемый тип в Swift?

Я пытаюсь искать элементы равные или меньше нуля в моем запросе, как это.....

for zeroItems in snapshot.value as! NSDictionary where zeroItems.value["Value"] as! Int <= 0

Я получаю Expected type ошибка. Пожалуйста, объясните и покажите мне, как исправить.

4 ответа

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

import Foundation

// Construct the data structure with demo data
struct Snapshot {
    let value: NSDictionary
}

let dict: NSDictionary = [ "a" : -1, "b" : 0, "c" : 1]
let snapshot = Snapshot(value: dict)

//Apply a filter
let zeroItems = snapshot.value.filter{Int($0.1 as! NSNumber) <= 0}

//View the result
print(zeroItems)

Почти наверняка вы злоупотребили Any если вы должны использовать это много as! бросает в одну строку. Создайте пользовательскую структуру для этого типа и преобразуйте данные в нее. Если вы проходите мимо NSDictionary и используя as! очень, ты борешься с системой.

Тем не менее, чтобы сделать эту работу, вам, вероятно, просто нужно больше скобок. Что-то вроде:

for zeroItems in (snapshot.value as! NSDictionary) where (zeroItems.value["Value"] as! Int) <= 0

Но это ужасный Свифт, поэтому избегайте этого, если это возможно.

Вы переводите snapshot.value как словарь, так zeroItems кортеж ключа и значения. Как я понимаю, у вас есть массив словарей, и вы хотите отфильтровать их по ключу "Значение", верно?

Если это так, то вы можете использовать следующий код:

// dictionary with Value key, and Int value
let dict: [String: Any] = ["Value":-1]
// array of dictionaries
let value: [[String: Any]] = [dict, <**add here as many as you want**>]


// get only array of integeres
let onlyIntegers = value.flatMap { $0["Value"] as? Int }.filter {$0 <= 0 }
print(onlyIntegers)


// get array of dictionaries which passes <=0 check 
let onlyLessOrEqualTo0 = value.filter { dict in
    if let value = dict["Value"] as? Int {
        return value <= 0
    }
    return false
}
print(onlyLessOrEqualTo0)

Прежде всего, добавление некоторых скобок поможет увидеть, в чем проблема:

for zeroItems in myDict as! NSDictionary where (zeroItems.value["Value"] as! Int) <= 0

Теперь мы получаем "Тип" Любой "не имеет подписных элементов". Так что проблема в том, что вы не сказали Swift, какой тип zeroItemsЗначение, которое я считаю словарем, судя по вашему коду:

Это компилирует для меня:

for zeroItems in myDict as! Dictionary<String, Dictionary<String, Int>> where zeroItems.value["Value"]! <= 0 

Однако это не красиво. Вы могли бы получить более читаемый код, используя filter как было предложено в другом ответе.

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