20

如何在 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()
    }

}

但如果这是唯一的方法......

4

3 回答 3

16

目前 swift 中没有可见性修饰符。

在开发者论坛上,语言作者说它在他们的优先级列表中。

从这里引用 greg parker 的话:

我们通常不会对未来做出任何承诺,但在这种情况下,我们会破例。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)
    }
}
于 2014-06-05T08:32:50.513 回答
3

或者,您可以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...  

但是,从技术上讲,它们不是私有的,因为有人可以实例化 aBakery.Baker并调用这些方法。函数内部的函数确实有效,但很难看......

于 2014-06-05T08:45:37.097 回答
2

在这里查看我的答案。

简而言之,当您谈论在 Swift 或 ObjC(或 ruby​​ 或 java 或……)中创建“私有方法”或“私有函数”时,这些方法并不是真正的“私有”。他们周围没有实际的访问控制。任何提供一点内省的语言都可以让开发人员在他们真的想要的时候从类之外获得这些价值。

因此,我们正在谈论的是一种定义面向公众的接口的方法,该接口只显示我们想要的功能,并“隐藏”我们认为“私有”的其余部分。

声明接口的快速机制是protocol,它可以用于此目的。

于 2014-06-13T13:44:10.243 回答