2014-07-23 3 views
2

Почему в Objective-C я могу установить переменный экземпляр внутри блока:Swift переменной классы получающего доступ внутрь CLOSURES

@interface CMVServices : UIViewController 
@property (nonatomic, strong) NSMutableArray *times; 

@implementation CMVServices 
@synthesize times=_times; 

and set the _times instance variable inside a block: 
(some code) 
. 
. 
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
[_times addObjectsFromArray:objects]; 
} 

, но я не могу в Swift?

class ViewController: UIViewController 
var times :AnyObject[]! 

query.findObjectsInBackgroundWithBlock { (objects: AnyObject[]!, error: NSError!) -> Void in 
self.times = objects 
} 

Послание: (? AnyObject []) раз = родитель не в состоянии оценить: переменная не указана

+2

Нам понадобится более полный код. Вы, конечно, можете изменять переменные экземпляра из внутренних закрытий в Swift. В идеале, было бы лучше, если бы вы могли предоставить нам какой-то код, который мы можем выбросить на игровое поле и воспроизвести ошибку. – drewag

ответ

2

две вещи:

  1. Swift синтаксис Array деклараций изменился с AnyObject[] до [AnyObject]
  2. Если вы все еще в классе, просто используйте times вместо self.times ,

Это работает для меня в XCode6-Beta4 в Playground файле:

import UIKit 

class CMVServices : UIViewController { 
    var times : [AnyObject] = [] 

    func testFunc() { 
     func findObjects(objects : [AnyObject]!, error : NSError!) { 
      times = objects 
      var test_str = "still evaluating in Playground here" 
     } 
     findObjects(["test", "string"], nil) 
    } 
} 

var test = CMVServices() 

test.testFunc() 

и полный на тест закрытия самих, это также работает (опять же, в XCode6-Beta4):

import UIKit 

class CMVServices : UIViewController { 
    var times: [AnyObject] = [] 

    func testClosure() { 
     { (objects : [AnyObject]!, error : NSError!) -> Void in 
      self.times = objects 
      NSLog("still evaluating") 
     }(["new", "test", "string"], nil) 
    } 
} 

var test = CMVServices() 

test.testClosure() 
test.times // ["new", "test", "string"] 
+0

Спасибо, snickle, вы попали в цель !! – user1593386