如何在Swift中创建私有函数?

21

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

}

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

3个回答

17

目前在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)
    }
}

3

另外,您也可以这样使用嵌套类

// 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 并调用方法。嵌套函数确实可行,但很难看...


我该如何在Baker中使用Bakery的某些对象? - Mrugesh Tank
明白了,在这里 - Mrugesh Tank

2

请看我在这里的答案。

简而言之,在Swift或ObjC(或Ruby或Java等)中,当你谈论制作“私有方法”或“私有函数”时,这些方法并不是真正的“私有”。它们周围没有实际的访问控制。任何提供一点内省的语言都可以让开发人员从类外部获取这些值,如果他们真的想要的话。

因此,我们所讨论的是一种定义公共接口的方式,该接口仅显示我们想要的功能,并“隐藏”我们认为是“私有”的其余内容。

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


“那些方法并不真正是‘私有的’”。我对这种观点非常不同意。这似乎是为了不在语言上拥有基本功能而进行的糟糕辩解。你所描述的是变通方法或黑客技巧,而不是普通开发人员日常使用的方法。 - Gonçalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接