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

时间:2014-06-05 08:29:53

标签: swift ios8

如何在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 个答案:

答案 0 :(得分:16)

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

在开发者论坛上,语言作者说它位于优先级列表的首位。

here引用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)
    }
}

答案 1 :(得分: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...  

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

答案 2 :(得分:3)

请参阅我的回答over here

简而言之,当你谈到在Swift或ObjC(或ruby或java或......)中创建“私有方法”或“私有函数”时,这些方法并不是真正的“私有”。它们周围没有实际的访问控制。任何提供一点内省的语言都可以让开发人员在课堂上获得这些价值,如果他们真的想要的话。

因此,我们所讨论的是一种定义面向公众的界面的方法,该界面仅显示我们想要的功能,并“隐藏”我们认为“私有”的其余部分。

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

相关问题