クレジット; drはあなたがのために自己を使用する必要がありますインスタンスメソッドですが、クラスメソッドでは必要ありません。クラスは、多くのインスタンスを有することができるが、エラーが1を発生なぜそれが唯一の(また、そのタイプ/クラス/静的関数を含む)自体の宣言
を有することができる:ベア心にalertFunc
がへの参照を持っていたかもしれませんそれがされている可能性がプロパティ
:
private func logAction() {
print("someProperty = \(self.someProperty")
}
だから、この場合には、それはあなたが最終的にプロパティに
を参照していることを明らかに明らかです
は、なぜエラーが2発生:あなたは、あなたの関数内self
への参照を持っていない場合は、インスタンスメソッドとしてそれを書いたので、まだ、自己がある暗黙的に渡されたが、我々は表示されません!
インスタンスメソッドは、実際に自己は、それがかもしれないボンネットの下に自動的に
渡される最初のパラメータのインスタンスを取る機能のためだけの構文糖、である。この
private func alertFunc (_ instance: MyType) {
print("someProperty = \(instance.someProperty")
}
// and actually the call to it *may* look something like this:
MyType.someFunc(self)
のように見える何か
私たちは決して自分が渡されるのを見ません...それは私たちを欺く統語的な砂糖です。
あなたのメソッドが内部的に(つまり、それはそれstatic/type/class methodまたはフリー機能
Alternative1作るために、おそらく実際には最善です)どのような方法でインスタンスの状態に依存しない:フリー機能を使用しています。その後、
class someClass {
...
}
func freeFunc {
print("Hi this is a free function, written outside the scope of any class...")
}
そして、あなたのクロージャ内あなたがfreeFunc()
Alternative2を使用してそれを呼び出す:クラスの機能を使用してください。
class someClass {
// some other code
class private func alertFunc() {
print("Hi this was a class function, see the class at the beginning of the func definition")
}
}
そしてあなたの閉鎖以内にあなたはyourClassName.alertFunc()
を使用してそれを呼び出すしかし、なぜそのクラスの機能は、メモリ・サイクルを作成しないということですが、インスタンス機能はありますか? 私はあなたが求めてうれしい:
をインスタンスmehtodsについて、あなたに手を差し伸べるインスタンスごとに、そこに新しいメモリロケーションがあると割り当て解除を持続します新しいメモリ・サイクルを生成します。
クラスメソッドの場合は、クラス/タイプメソッドに到達するたびに、同じクラス/タイプのメソッドに到達し、そのクラスメソッドを永続化している間は、それは一度だけ作成され、完了しました!客観-C(およびC++)で
方法を入力します。
アプリが起動すると、システムはかなり安全にちょうど彼らのクラスのポインタ と共にメモリにそれらの型のメソッドのためのすべての命令 を事前に割り当てることができますオーバーヘッドはほとんどありません。何度も何度も何度も頭上を呼びます。
私は同じことをやっていると思います。
機能は、Swiftのファーストクラスタイプです。明らかにそれらは意味的に異なっていますが、事実上関数は単純に異なる種類の変数である可能性があります。 – PeejWeej