Swift ....类方法与实例方法

时间:2015-08-27 12:55:45

标签: swift

提前感谢您的帮助!!

我试图从我的班级中调用一个函数,但我一直收到错误说:

缺少参数#1的参数.............阅读一些帖子说它是一个实例与类的问题?我没有得到它......我在班级内调用该方法???如果调用该方法,则必须有一个类的实例?????对?这是我的代码......谢谢

import Foundation
import Parse

class TestViewController {

    let photos = getWallImages() //-----This is the line requesting an argument

    func getWallImages() -> [WallPost] {
        let query = WallPost.query()!
        query.findObjectsInBackgroundWithBlock { objects, error in

            if error == nil {
                if let objects = objects as? [WallPost] {
                    return objects
                    println("We have \(objects.count)")
                }
            } else if let error = error {
                println(error)
            }
        }
    }

}

3 个答案:

答案 0 :(得分:1)

有几种方法可以恰当地设置您的财产。您可以将getWallImages()设为类型方法:

class TestViewController {

    let photos = TestViewController.getWallImages()

    class func getWallImages() -> [WallPost] {
         ....
    }

}

或者,您可以将方法保留为实例方法,并在初始化时设置属性:

class TestViewController {

    let photos: [WallPost]!

    init() {
        super.init()
        photos = getWallImages()
    }

    func getWallImages() -> [WallPost] {
         ....
    }

}

答案 1 :(得分:1)

所以"犯罪"您提交的是该方法应用于类的实例而不是类方法。该函数需要 self 参数(对实例的引用)。这解释了错误消息。

现在要解决的问题是你有两个快速选择:

1。让它成为一个类函数并以这种方式调用它:

class TestViewController {
    let photos = TestViewController.getWallImages()

    class func getWallImages() -> [WallPost] {
        // mumbo jumbo
    }
}

如果你想要做一些特定于实例的操作,这种方法是有问题的,因为class func是静态方法,并没有为你提供一些对象的好处。

2. 实例化您正在调用方法的对象:

class TestViewController {
    let photos = TestViewController().getWallImages()

    func getWallImages() -> [WallPost] {
        // mumbo jumbo
    }
}

这种方法对于您给定的结构并不正确 - 实例化另一个视图控制器没有意义,但是如果您采用该方法并将其放在单独的类中,也许它会有意义。

当然,您还有多种其他方法可以更改代码以使其正常工作。也许您可以使用lazy参数初始化它,也许您可​​以在init方法中初始化它。无论什么最适合你。我的回答只是解释你哪里出错了。

答案 2 :(得分:0)

如果您提出问题,则应将代码降至最低,并丢弃不必要的详细信息。

你可能想要这样的东西:

class MyClass {
    let x = MyClass.getStuff()

    static func getStuff() -> Int {
        return 0
    }
}

但是,您的方法getWallImages()无法执行此类操作,因为它会以异步方式返回结果,这意味着您可以在函数返回后稍后获得结果。

你可以做这样的事情(这就是我这样做的方式):

class MyClass {
    var x : Int? {
        didSet {
            if let x = x {
                // Do something with x, here it's assigned
            } else {
                // x was set to nil, something failed
            }
        }
    }

    init() {
        getStuffAsynchronous()
    }

    func getStuffAsynchronous() {
        // Do your query stuff here, assign x to your objects to invoke the didSet
        x = 0

        // If it fails somehow, assign set x to nil
        // if fail {
        //     x = nil
        // }
    }
}