2015-08-27 90 views
1

在此先感谢帮助!Swift ....类方法与实例方法

我想从我的类中调用函数求,我不断收到一个错误,指出:

缺少参数参数#1 .............阅读很少有职位说这是一个实例VS类问题?我不明白它..我从类内调用方法?如果该方法被称为?????,那么必须有该类的一个实例。对?这里是我的代码...谢谢

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) 
      } 
     } 
    } 

} 
+0

如果该方法不需要该类的实例在类之外声明该函数。在Objective-C等语言中,有一些不需要实例的类方法,Swift类型的方法是相似的。请注意,较低级别的对类实例方法的调用会传递一个类实例指针。 – zaph

+0

澄清,因为答案使用不同的关键字来创建类型方法,从Apple文档:“您可以通过在方法的func关键字之前写入关键字static来指示类型方法。类也可以使用class关键字来允许子类重写超类的实现方法。” – zaph

回答

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 
     // } 
    } 
} 
+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] { 
     .... 
    } 

} 
+0

我明白了...谢谢! –

1

所以“犯罪”你犯的是,该方法在实例应用的事实类而不是类方法。该函数需要一个self参数(对实例的引用)。这解释了错误信息。

我们解决这个问题有两个快速选项:

使它成为一个类的函数,并调用它的方式太:

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方法中初始化它。无论你最适合什么。我的回答只是解释你出错的地方。

+0

谢谢Michal! –