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()
}
}
しかし、これがそれを行う唯一の方法である場合...
現時点では、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)
}
}
または、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
をインスタンス化してメソッドを呼び出すことができるため、技術的にはプライベートではありません。関数内の関数は機能しますが醜いです...
私の答えを見てください こちら 。
要するに、Swift or ObjC(or Ruby or Javaまたは…)これらのメソッドは実際には「プライベート」ではありません。実際のアクセス制御はありません。内省を少しでも提供する言語であれば、開発者は本当に必要な場合にクラスの外部からこれらの値にアクセスできます。
したがって、私たちが話しているのは、必要な機能のみを表示し、「プライベート」と見なす残りの部分を「非表示」にするパブリックインターフェースを定義する方法です。
Swiftインターフェースを宣言するメカニズムはprotocol
であり、この目的に使用できます。