2015-03-09 4 views
1

я пытаюсь получить идентификатор пользователя и мой сценарий держит неудачу:Swift Dynamic Cast Failure

func getUserID(users:NSString){ 
    var username:NSString = "abcd" 
    println(username) 
    if (username.isEqualToString("")) { 

     var alertView:UIAlertView = UIAlertView() 
     alertView.title = "Failed to find user" 
     alertView.message = "Please try logging in and out." 
     alertView.delegate = self 
     alertView.addButtonWithTitle("OK") 
     alertView.show() 
    } else { 

    var post:NSString = "username=\(username)" 

    NSLog("PostData: %@",post); 

    var url:NSURL = NSURL(string: "http://turbo-tires-21-188007.euw1.nitrousbox.com/jsonGetUserID.php")! 

    var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)! 

    var postLength:NSString = String(postData.length) 

    var request:NSMutableURLRequest = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = postData 
    request.setValue(postLength, forHTTPHeaderField: "Content-Length") 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.setValue("application/json", forHTTPHeaderField: "Accept") 


    var reponseError: NSError? 
    var response: NSURLResponse? 

    var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError) 

    if (urlData != nil) { 
     let res = response as NSHTTPURLResponse!; 

     NSLog("Response code: %ld", res.statusCode); 

     if (res.statusCode >= 200 && res.statusCode < 300) 
     { 
      var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)! 

      NSLog("Response ==> %@", responseData); 

      var error: NSError? 

      let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary 


      let idusers:NSInteger = jsonData.valueForKey("idusers") as NSInteger 

     } 
    } 
    } 

} 

и ошибка вывода заключается в следующем:

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional: 
0x111199620: pushq %rbp 
0x111199621: movq %rsp, %rbp 
0x111199624: pushq %rbx 
0x111199625: pushq %rax 
0x111199626: movq %rsi, %rcx 
0x111199629: movq %rdi, %rbx 
0x11119962c: xorl %eax, %eax 
0x11119962e: testq %rbx, %rbx 
0x111199631: je  0x11119964c    ; 
swift_dynamicCastObjCClassUnconditional + 44 
0x111199633: movq 0x82756(%rip), %rsi  ; "isKindOfClass:" 
0x11119963a: movq %rbx, %rdi 
0x11119963d: movq %rcx, %rdx 
0x111199640: callq 0x11119c1ca    ; symbol stub for: 
objc_msgSend 
0x111199645: testb %al, %al 
0x111199647: movq %rbx, %rax 
0x11119964a: je  0x111199653    ; 
swift_dynamicCastObjCClassUnconditional + 51 
0x11119964c: addq $0x8, %rsp 
0x111199650: popq %rbx 
0x111199651: popq %rbp 
0x111199652: retq 
0x111199653: leaq 0xcdc8(%rip), %rax  ; "Swift dynamic cast failed" 
0x11119965a: movq %rax, 0x8ae57(%rip)  ; gCRAnnotations + 8 
0x111199661: int3 
0x111199662: nopw %cs:(%rax,%rax) 

Я пытался много разные способы думать, что это был формат строки, но до сих пор ничего не работало.

getUserID("abcd"); 

Так я называю метод. Эта ошибка приводит к сбою приложения и устранению ошибки выше, я получаю (lldb) в утешительном. Любая помощь будет большой.

UPDATE: Я сузил ошибку:

let idusers:NSInteger = jsonData.valueForKey("idusers") as NSInteger 

РЕШИТЬ: проблемы была число в формате JSON является строкой, поэтому я использовал NSString, и она работает.

ответ

1

С jsonData является NSDictionary, он может содержать только объекты. NSInteger не является объектом, это тип для int или long. Я предполагаю, что ваша ценность на самом деле NSNumber, так что ваш бросок должен быть:

let idusers: = jsonData.valueForKey("idusers") as NSNumber 

В вашем случае, значение оказалось, строка:

let idusers: = jsonData.valueForKey("idusers") as String 
+0

пусть idusers: NSNumber = jsonData.valueForKey («idusers»), поскольку NSNumber, похоже, является той же ошибкой. – Shinerrs

+0

NSInteger действительно работает, проблема заключалась в том, что число в json - это строка, поэтому я использовал NSString, и она работает. – Shinerrs

+0

Ну, я предположил, что на самом деле это число, но да, если это строка, вы должны использовать 'NSString';). – Rengers