2015-03-23 1 views
0

Я пытаюсь получить доступ к переменной i, которая находится внутри функции checkUser(). Следующим важным моментом является, если заявление, if i == 0, который должен println("Displaying Picture of Someone else")Как получить доступ к переменной внутри функции, а затем использовать ее?

код в нижней части не работает, потому что функция checkUser не возвращает i значение, и я получаю сообщение об ошибке: use of unresolved identifier 'i', однако после того, как ковыряться и корректировки кода до:

func checkUser() -> (Int?) { 
    var i = 0 
    return (i) 
} 

var (i) = checkUser() 
if i == 0{ 
    println("Value is set") 
} 

и внедрив его, я получаю сообщение об ошибке int is not convertible to void. Каковы мои варианты, чтобы заставить его работать?


func checkUser(){ 
    var reqest = PFUser.query() 

    reqest.whereKey("username", equalTo: self.user.username) 
    reqest.whereKey("check", equalTo: true) 
    reqest.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!)-> Void in 
     if error == nil { 
      println("Successfully retrieved \(objects.count) item.") 

      var i = objects.count // variable that holds objects.count 

      if let objects = objects as? [PFObject] { 
       for object in objects { 
        println(object.objectId) 
        if object["check"] as Bool == true{ 
         println("Displaying Picture of You") 
        } 
       } 
      } 
     } else { 
      // Log details of the failure 
      println("Error: \(error) \(error.userInfo!)") 
     } 
    } 

    if i == 0{ 
     println("Displaying Picture of Someone else") 
    } 
} 
+0

Вы используете значение 'i', чтобы отобразить соответствующее изображение? – sasquatch

+0

@sasquatch, Да, это именно то, что я делаю. Если 'request' не находит никаких результатов, он будет' println («Отображение изображения кого-то еще») ' –

ответ

0

Спасибо вам ребята за все ответы. Действительно имеет смысл; Я создал функцию и переместил ее в блок завершения, и она сработала.

func checkUser(){ 

func displayPicture() { 
    println("Displaying Picture of someone else") 
} 

var reqest = PFUser.query() 
//reqest.whereKey("college", equalTo: self.user.valueForKey("college")) 
reqest.whereKey("username", equalTo: self.user.username) 
reqest.whereKey("check", equalTo: true) 
reqest.findObjectsInBackgroundWithBlock { 
    (objects: [AnyObject]!, error: NSError!)-> Void in 
    if error == nil { 

println("Successfully retrieved \(objects.count) item.") 

     if(objects.count == 0){ 
      displayPicture() 
     } 



if let objects = objects as? [PFObject] { 
      for object in objects { 
       println(object.objectId) 
       if object["check"] as Bool == true{ 
        println("Displaying Picture of You") 


        self.textFieldName.hidden = true 
        self.checkCommand.hidden = true 

        let userName = PFUser.currentUser().valueForKey("name")as String 
        //self.firstName.text = userName // Displays current username 
        self.personName = userName 


        let userPicture = PFUser.currentUser().valueForKey("profilePic") as PFFile 
        userPicture.getDataInBackgroundWithBlock{ 
         (imageData:NSData!,error:NSError!) -> Void in 
         if error == nil{ 
          let image:UIImage! = UIImage(data: imageData) 
          self.profilePic.image = image //displays current user picture 
         } 
         else { 
          // Log details of the failure 
          println("Picture not downloaded: \(error) \(error.userInfo!)") 
         } 
        } 


       } 
       }}} else { 
     // Log details of the failure 
     println("Error: \(error) \(error.userInfo!)")} 

} 
} 
0

Из кода:

func checkUser(){ 
var reqest = PFUser.query() 

reqest.whereKey("username", equalTo: self.user.username) 
reqest.whereKey("check", equalTo: true) 
reqest.findObjectsInBackgroundWithBlock { 
    (objects: [AnyObject]!, error: NSError!)-> Void in 
    if error == nil { 
     println("Successfully retrieved \(objects.count) item.") 

     var i = objects.count // variable that holds objects.count 

     if let objects = objects as? [PFObject] { 
      for object in objects { 
       println(object.objectId) 
       if object["check"] as Bool == true{ 
        println("Displaying Picture of You") 
       } 
      } 
     } 
    } else { 
     // Log details of the failure 
     println("Error: \(error) \(error.userInfo!)") 
    } 
} 

if i == 0{ 
    println("Displaying Picture of Someone else") 
} 
} 

Я бы сказал, что вы определили переменную внутри блока, но пытался использовать его снаружи. Это не сработает.

Попробуйте установить var i : Int = 0 ниже var request = PFUser.query()

Кроме того, @Frank Шмитта имеет точку. удалите браслеты.

0

Во втором фрагменте кода вам просто нужно переместить этот код внутри блока завершения, где определен i.

Это вопрос понимания выполнения асинхронного кода природы.

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

Это помогает думать о async-коде, когда вы просите что-то сделать «когда вы его обходите». Вам нужно решить, как этот код должен сообщить вам, что он добрался до него.

0

Определение переменной i (var i = objects.count) определяется в разных пределах от места, где вы проверяете его значение. В частности, это определено в anonymous closure, вы переходите на reqest.findObjectsInBackgroundWithBlock

Вы можете исправить ошибку времени компиляции, указав i выше вызова reqest.findObjectsInBackgroundWithBlock. Однако это просто даст вам ошибку времени выполнения.

То, что здесь происходит, что код внутри {} непосредственно после reqest.findObjectsInBackgroundWithBlock запускается после завершает вызов, который означает, что он будет работать после теста if i == 0{...

Более, что код внутри предыдущего блока.

1

Если и хочет, чтобы отобразить изображение Чужого на основе подсчета результатов запроса, вы можете вызвать функцию вместо создания и проверки состояния:

func checkUser(){ 
var reqest = PFUser.query() 

reqest.whereKey("username", equalTo: self.user.username) 
reqest.whereKey("check", equalTo: true) 
reqest.findObjectsInBackgroundWithBlock { 
(objects: [AnyObject]!, error: NSError!)-> Void in 
if error == nil { 
    println("Successfully retrieved \(objects.count) item.") 

    if (objects.count == 0) { 
    displayPicture() 
    } 

    if let objects = objects as? [PFObject] { 
    for object in objects { 
     println(object.objectId) 
     if object["check"] as Bool == true{ 
     println("Displaying Picture of You") 
     } 
    } 
    } 
} else { 
    // Log details of the failure 
    println("Error: \(error) \(error.userInfo!)") 
} 
} 

displayPicture() { 
    println("Displaying Picture of someone else") 
    } 
} 
Смежные вопросы