我正在使用xcode 6 beta 6,对于没有参数的函数,我得到了这个奇怪的错误。
这是函数
func allStudents ()-> [String]{
var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "Student")
request.returnsObjectsAsFaults = false
//Set error to nil for now
//TODO: Give an actual error.
var result:NSArray = context.executeFetchRequest(request, error: nil)
var students:[String]!
for child in result{
var fullname:String = child.valueForKey("firstName") as String + " "
fullname += child.valueForKey("middleName") as String + " "
fullname += child.valueForKey("lastName") as String
students.append(fullname)
}
return students
}
这是电话
var all = StudentList.allStudents()
这是一个错误还是我在这里做错了什么?
答案 0 :(得分:51)
假设StudentList
是一个类,即
class StudentList {
func allStudents ()-> [String]{
....
}
}
然后是这样的表达
var all = StudentList.allStudents()
将抛出所述异常,因为allStudents
应用于类而不是类的实例。 allStudents
函数需要self
参数(对实例的引用)。它解释了错误消息。
如果你这样做,这将解决。
var all = StudentList().allStudents()
答案 1 :(得分:13)
Swift有实例方法和类型方法。实例方法是从类的特定实例调用的方法。 Type Method是一个从类本身调用的静态方法。
实例方法看起来像这样:
class StudentList {
func allStudents() -> [String] {
....
}
}
为了调用allStudents
方法,需要首先初始化StudentsList
类。
let list = StudentsList() // initialize the class
let all = list.allStudents() // call a method on the class instance
尝试在类本身上调用实例方法会产生错误。
Type Methods是属于类的静态方法,而不是类的实例。正如@ AnthodyKong的回答中提到的那样,可以在class
之前使用static
或func
关键字创建类型方法。类通过引用传递,Structs按值传递,因此这些类称为引用类型和值类型。这是他们的样子:
参考类型
class StudentList {
class func allStudents() -> [String] {
....
}
}
值类型
struct StudentList {
static func allStudents() -> [String] {
....
}
}
致电
let all = StudentList.allStudents()
因为allStudents
是一种类型方法,所以不需要首先初始化类(或结构)。
另见