范围和方法传递

时间:2014-06-08 19:57:29

标签: swift

我在课堂上定义了这个:

class TableViewController: UITableViewController {

    let sections = ["Design", "Development", "Mobile"]
    var blogPost1 = ["title" : "StackOverflow", "author" : "John Doe"]
    var blogPost2 = ["Getting started" : "title", "John" : "author"]
    var posts = [blogPost1, blogPost2]

    override func viewDidLoad() {

        super.viewDidLoad()

        var blogPosts = [blogPost1, blogPost2]
    }
}

我不明白为什么我能够在viewDidLoad内创建blogPosts变量但不能在blogPost2下的类中创建?如果我尝试,Xcode将不会自动完成并返回一个错误,指出ViewController没有名为“blogPost1”的成员。但是我可以在viewDidLoad()中创建它,但我不知道如何在其他函数中使用它。

第二期:

我有一个TableViewController。在cellForRowAtIndexpath中,我正在尝试发送此消息:

 var posts = blogPosts.objectAtIndex(indexPath.row)

但自动完成中不建议使用objectAtIndex。我确定这是一个新手的错误,但我迷失了。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

对于第二个问题, objectAtIndex 是NSArray类的方法,而您创建的变量blogPosts是Array(Swift)的类型。

只需使用下标语法:

var posts = blogPosts[indexPath.row]

答案 1 :(得分:0)

第一个问题的答案是,使用默认值初始化属性无法访问self,因为该对象尚未完全初始化。您需要将初始化移动到init方法中。

init() {
    blogPost1 = ["title" : "StackOverflow", "author" : "John Doe"]
    blogPost2 = ["Getting started" : "title", "John" : "author"]
    posts = [blogPost1, blogPost2]
}

另请注意,您对键和值的使用不一致,以后会咬你的。

正如Oguz指出的那样,你的第二个问题是你试图在数组上使用NSArray方法,最简单的方法是使用blogPosts[indexPath.row]但是,这可能对你不起作用,因为blogPosts不是' t定义为一个属性,它被定义为函数中的局部变量。您可以使用posts[indexPath.row]