무작위로 생성 된 숫자 배열이 있으며 선택한 숫자 배열의 색인 [0]에있는 값과 동일한 질문에 대해 Firebase에 쿼리하려고합니다. 현재 문제는 오류가 발생한다는 것 Cannot subscript a value of type '[UInt32]'
입니다. 추신 : 나는 신속하게 경험이 많지 않으므로 정확한 코드 솔루션은 매우 가치가 있습니다! 내 firebase 구조도 첨부했습니다 ...
import UIKit
import Firebase
class QuestionViewController: UIViewController {
let ref = Firebase(url: "https://123test123.firebaseio.com/questions")
override func viewDidLoad() {
super.viewDidLoad()
// An empty array to hold the selected numbers
var selectedNumbers: [UInt32] = []
// A range of acceptable numbers
let randomNumberRange = 1...10
// How many numbers are needed?
let randomNumbersToChoose = 10
// Crash if asking for more numbers than are available in the range
assert(randomNumberRange.count >= randomNumbersToChoose, "Must have enough numbers to choose from!")
// Repeat this loop until all enough numbers have been selected
while selectedNumbers.count < randomNumbersToChoose {
// Pick a random number within the allowed range
let selectedNumber = arc4random_uniform(UInt32(randomNumberRange.endIndex - randomNumberRange.startIndex)) + UInt32(randomNumberRange.startIndex)
// If it's not already in the selected array, add it
if (selectedNumbers.indexOf(selectedNumber) == nil) {
selectedNumbers.append(selectedNumber)
}
}
// Print the result
print(selectedNumbers)
print(selectedNumbers)
let selectedNumberIndex: UInt32 = 2
ref.queryOrderedByChild("value").queryEqualToValue(selectedNumbers[0])
.observeEventType(.ChildAdded, withBlock: {
snapshot in
//Do something with the question
print(snapshot.key)
print(snapshot.value.valueForKey("question"))
})
}
@IBAction func truepressed(sender: AnyObject) {
}
@IBAction func falsePressed(sender: AnyObject) {
}
}
JSON 데이터 :
{
"question1" : {
"answer" : "Nohghpe",
"question" : "Do you know swift",
"value" : 1
},
"question10" : {
"answer" : "A fdsbit",
"question" : "Do you kndfggow firebase",
"value" : 10
},
"question2" : {
"answer" : "A bfhit",
"question" : "Dodhfg you know firebase",
"value" : 2
},
"question3" : {
"answer" : "A bsdit",
"question" : "Do you know firebsgdfase",
"value" : 3
},
"question4" : {
"answer" : "A vcxbit",
"question" : "Do yosgfdu know firebase",
"value" : 4
},
"question5" : {
"answer" : "A bivcxt",
"question" : "Do you kfghnow firebase",
"value" : 5
},
"question6" : {
"answer" : "A bxcvit",
"question" : "Do you know fnhirebase",
"value" : 6
},
"question7" : {
"answer" : "A bivxct",
"question" : "Do you sgdfknow firebase",
"value" : 7
},
"question8" : {
"answer" : "A bivcxt",
"question" : "Do you knsfdow firebase",
"value" : 8
},
"question9" : {
"answer" : "A bdsfit",
"question" : "Do you kdfgnow ffsdirebase",
"value" : 9
}
}
이것은 Swift 컴파일러가 다른 오류 뒤에있는 실제 오류를 가리는 전형적인 상황입니다. .queryEqualToValue(..)
방법 유형의 인수를 기대한다 AnyObject
; 이는 참조 (클래스) 유형 만 보유 할 수있는 반면 UInt32
값 유형입니다.
혼란의 또 다른 주제는 우리가 일반적으로 사실을 사용하고 있다는 수 AnyObject
종류, 수 보이는 개최 Int
사실 이러한 과제에 암시 적으로 스위프트 기본 변환 유형을 Int
재단에 값 형식 __NSCFNumber
참조 형식을. 그러나이 암시 적 변환은 UInt32
유형에 사용할 수 없습니다 .
var a : AnyObject?
let foo : [Int] = [1, 2, 3]
let bar : [UInt32] = [1, 2, 3]
/* OK: Int -> [implicitly] -> __NSCFNumber */
a = foo[0]
print(a!.dynamicType) // __NSCFNumber
/* Not OK */
a = bar[0]
/* error: cannot subscript a value of type '[UInt32]' a = bar[0] */
따라서 다음과 같이이 문제를 해결할 수 있습니다.
분들께 selectedNumbers
배열 0F 할 Int
것이 아니라, UInt32
(그에 따라 코드의 영향을받는 부분을 수정).
에 대한 호출 에서에서 UInt32
로 유형 변환을 수행합니다 . 예 : 위의 예에서 :Int
.queryEqualToValue(..)
a = Int(bar[0])
그냥 32 비트 시스템 (예를 들어, 아이폰 5)에 대해, 숫자의 절반 상위 범위에 의해 표현 가능한 것을주의 걸릴 UInt32
으로 표현 될 수없는 유형의 Int
32 비트 시스템에서, 이후 유형을 Int
대응에 Int32
.
INT32_MAX // 2147483647
UINT32_MAX // 4294967295
코드에 잠깐 눈에서, 그러나,의 요소로이 여기에 문제가 될 수 있어야 것처럼 보이지 않는다 selectedNumbers
더 큰 숫자가 되듯이 포함되지 않습니다 UInt32
확인을로, 64 비트 시스템 (및 Int
에 해당합니다 Int64
). 그러나이 옵션을 선택하는 경우 모범 사례 를 위해 응용 프로그램을 실행하려는 시스템 UInt32
의 Int
유형으로 값을 나타낼 수 있다는 것을 변환 전에 어설 션 해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다