web-dev-qa-db-ja.com

Swiftでプライベート関数を作成するにはどうすればよいですか?

Swiftでプライベート関数を作成するにはどうすればよいですか?

次に例を示します。

import UIKit

class AnotherClass {

    var someVar = 1
    let someConst = 2

    func somePrivateFunc() -> Bool {
        return true
    }

    func someFunc() -> (Int -> Bool) {
        var someInnerFuncVar = { (num: Int)->Bool in
            return true
        }

        return someInnerFuncVar
    }

    init() {
        var vc = ViewController()
    }

}

しかし、これがそれを行う唯一の方法である場合...

20
SirRupertIII

現時点では、Swiftには可視性修飾子はありません。

開発者フォーラムで、言語の作者はそれが彼らの優先リストのトップにあると言いました。

here からの集計パーカーの引用:

通常、将来については何も約束しませんが、この場合は例外とします。 Swiftにはアクセス制御メカニズムがあります。

同じフォーラムで、彼らはこの方法でネストされたクラスを使用できることを示唆していますが、これは実際にはコードの完了が内部メソッドをキャッチするのを防ぐためだけのものです。ネストされたクラスをインスタンス化してそれらのメソッドにアクセスできるという意味では、これらは実際にはプライベートではありません。

import Foundation

class KSPoint {

    class _KSPointInner {
        class func distance(point p1 : KSPoint, toPoint p2 : KSPoint) -> Double {
            return sqrt(pow(Double(p2.x - p1.x), 2) + pow(Double(p2.y - p1.y), 2))
        }
    }

    var x : Int

    func distance(point : KSPoint, toPoint : KSPoint) -> Double {
        return _KSPointInner.distance(point: point, toPoint: toPoint)
    }
}
16

または、Nested Classesを次のように使用できます。

// Public interface
class Bakery
{
    // Private implementation
    class Baker
    {
        func prepareToMakeBread(numberOfLoafs:Int)
        {
            println("Preparing to make \(numberOfLoafs) loafs of bread...")
        }

        func bakeBread()
        {
            println("Baking the bread...")
        }

        func packageBread()
        {
            println("Packaging the freshly baked bread...")
        }
    }

    // Public method
    func buyBread(numberOfLoafs:Int)
    {
        println("Customer requests \(numberOfLoafs) loafs of bread!")

        let baker = Bakery.Baker()

        baker.prepareToMakeBread(numberOfLoafs)
        baker.bakeBread()
        baker.packageBread()
    }
}

let bakery = Bakery()    
bakery.buyBread(4)

出力:

Customer requests 4 loafs of bread!  
Preparing to make 4 loafs of bread...  
Baking the bread...  
Packaging the freshly baked bread...  

ただし、誰かがBakery.Bakerをインスタンス化してメソッドを呼び出すことができるため、技術的にはプライベートではありません。関数内の関数は機能しますが醜いです...

3
Erik

私の答えを見てください こちら

要するに、Swift or ObjC(or Ruby or Javaまたは…)これらのメソッドは実際には「プライベート」ではありません。実際のアクセス制御はありません。内省を少しでも提供する言語であれば、開発者は本当に必要な場合にクラスの外部からこれらの値にアクセスできます。

したがって、私たちが話しているのは、必要な機能のみを表示し、「プライベート」と見なす残りの部分を「非表示」にするパブリックインターフェースを定義する方法です。

Swiftインターフェースを宣言するメカニズムはprotocolであり、この目的に使用できます。

3
jemmons