私はXcode 6ベータ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()
これはバグですか、ここで何か間違っていますか?
StudentList
がクラス、つまり.
class StudentList {
func allStudents ()-> [String]{
....
}
}
次に、このような式
var all = StudentList.allStudents()
allStudents
がクラスのインスタンスではなくクラスに適用されるため、上記の例外がスローされます。 allStudents
関数は、self
パラメーター(インスタンスへの参照)を予期しています。エラーメッセージについて説明します。
これを行うと解決します
var all = StudentList().allStudents()
Swiftにはインスタンスメソッドとタイプメソッドがあります。インスタンスメソッドは、クラスの特定のインスタンスから呼び出されるメソッドです。型メソッドは、クラス自体から呼び出される静的メソッドです。
インスタンスメソッドは次のようになります。
class StudentList {
func allStudents() -> [String] {
....
}
}
allStudents
メソッドを呼び出すには、最初にStudentsList
クラスを初期化する必要があります。
let list = StudentsList() // initialize the class
let all = list.allStudents() // call a method on the class instance
クラス自体でインスタンスメソッドを呼び出そうとすると、エラーが発生します。
タイプメソッド は、クラスのインスタンスではなく、クラスに属する静的メソッドです。 @AnthodyKongの答えへのコメントで示唆されたように、class
またはstatic
の前にfunc
キーワードを使用して、タイプメソッドを作成できます。クラスは参照で渡され、構造体は値で渡されるため、これらは参照型および値型と呼ばれます。それらは次のようになります。
参照タイプ
class StudentList {
class func allStudents() -> [String] {
....
}
}
値タイプ
struct StudentList {
static func allStudents() -> [String] {
....
}
}
で通話
let all = StudentList.allStudents()
allStudents
は型メソッドであるため、最初にクラス(または構造体)を初期化する必要はありません。
こちらもご覧ください