如何在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()
}
}
但如果这是唯一的方法......
答案 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
,它可以用于此目的。