2016-11-27 8 views
1
내가 항목과 동일하거나 그렇게처럼 내 쿼리에 0보다 작은을 찾기 위해 노력하고

.....<= 예상되는 유형을 신속하게 요청하는 피연산자?

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

가 나는 Expected type 오류를 받고 있어요. 설명하고 수정 방법을 알려주십시오.

+1

왜 Swift에서 NSDictionary를 사용하고 있습니까?! – Alexander

+0

@AlexanderMomchliov 데이터가 Firebase에서 나왔기 때문에 NSDictionary를 사용하고있었습니다. –

+1

괜찮습니다. 네이티브 스위프트 사전에 캐스트하면 즉시 네이티브 스위프트 유형의 모든 이점을 얻을 수 있습니다. – Alexander

답변

1

많은 as! 캐스트를 한 줄에 사용해야하는 경우 거의 확실하게 Any을 과도하게 사용했습니다. 이 형식에 대한 사용자 지정 구조체를 만들고 데이터를이 형식으로 변환합니다. NSDictionary을 지나가고 as!을 사용하면 시스템과 싸우고있는 것입니다.

즉,이 작업을 수행하려면 더 많은 괄호가 필요할 것입니다. 다음과 같이하십시오 :

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

하지만 이것은 가능한 한 신속하게 피해야합니다.

+0

Swift에서 Foundation 데이터 유형이 그렇게 널리 퍼지는 이유는 무엇입니까?! 그것은 너무 많은 불필요한 복잡성을 추가하지만 사람들은 여전히 ​​그것을 계속합니다. 나는 그것을 얻지 않는다! – Alexander

2

filter을 적용하여 논리가 0보다 작은 요소 만 포함하도록 단순화하는 것이 좋습니다. IBM Swift Sandbox에서 작업 예제를 만들었습니다.

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) 
1

당신은 너무 zeroItems이 키와 값의 튜플, 사전 등 snapshot.value 해석. 사전의 배열을 이해하고 "값"키로 필터를 필터링하겠습니까? 어디에 문제가보고에 도움이 될 몇 가지 괄호를 추가, 모든

// 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) 
0

첫째 : 그럼 당신이 코드를 다음 사용할 수 있습니다 경우

지금

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

, 우리는 '유형'가져 임의의 '아래 첨자 멤버가 없습니다.' 그래서 문제가 당신이 유형은 내가의 사전 코드에서 판단, 생각 zeroItems의 값의 어떤 스위프트 말하지 않은 것입니다 :

이 나를 위해 컴파일 :

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

그러나, 이것은 예쁘지 않습니다. 다른 대답으로 제안 된대로 아마도 filter을 사용하여 더 읽기 쉬운 코드를 얻을 수 있습니다.