【问题标题】:Swift accessing class variable inside closuresSwift 访问闭包内的类变量
【发布时间】:2014-07-23 15:27:14
【问题描述】:

为什么在 Objective-C 中我可以在块中设置实例变量:

@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[]?) times = parent 无法评估:变量不可用

【问题讨论】:

  • 我们需要更完整的代码。你当然可以在 Swift 的闭包中修改实例变量。理想情况下,最好能提供给我们一些代码,我们可以将其放入操场并重现错误。

标签: variables swift closures


【解决方案1】:

两件事:

  1. Array 声明的 Swift 语法已从 AnyObject[] 更改为 [AnyObject]
  2. 如果您仍在课程范围内,只需使用times 而不是self.times

这适用于我在 Playground 文件中的 XCode6-Beta4 中:

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"]

【讨论】:

  • 谢谢snickle,你中了目标!!
猜你喜欢
  • 2015-10-30
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多