<= Операнд запрашивает ожидаемый тип в 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
как было предложено в другом ответе.