web-dev-qa-db-ja.com

パラメーターのない関数の呼び出しエラーでパラメーター#1の引数がありません。 Swift

私は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()

これはバグですか、ここで何か間違っていますか?

23
Boid

StudentListがクラス、つまり.

class StudentList {

    func allStudents ()-> [String]{
      ....
    }
}

次に、このような式

var all = StudentList.allStudents() 

allStudentsがクラスのインスタンスではなくクラスに適用されるため、上記の例外がスローされます。 allStudents関数は、selfパラメーター(インスタンスへの参照)を予期しています。エラーメッセージについて説明します。

これを行うと解決します

var all = StudentList().allStudents()
51
Anthony Kong

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は型メソッドであるため、最初にクラス(または構造体)を初期化する必要はありません。

こちらもご覧ください

13
Suragch