如何在 Swift 中创建私有函数? [复制]

Posted

技术标签:

【中文标题】如何在 Swift 中创建私有函数? [复制]【英文标题】:How do I make a private function in Swift? [duplicate] 【发布时间】:2014-07-26 03:43:44 【问题描述】:

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


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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

或者,您可以像这样使用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 并调用这些方法。函数内部的函数确实可以工作,但是很丑……

【讨论】:

如何在Baker中使用Bakery的一些对象?? 知道了,here【参考方案3】:

看我的回答over here。

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

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

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

【讨论】:

“这些方法并不是真正的“私有””。我不能更不同意这种观点。没有语言的基本功能似乎是一个不好的理由。您所描述的是解决方法或黑客,而不是普通的开发人员日常。

以上是关于如何在 Swift 中创建私有函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中创建十六进制颜色字符串 UIColor 初始化程序? [复制]

如何使用 Swift 在 iOS 中创建类似于标签栏选择动画的 LinkedIn?

Flutter:如何在我的 Style 类中创建构造函数? [复制]

如何在 Python 中创建多个构造函数? [复制]

如何在 Swift 5 中创建一个继承自另一个类的 UIImageView 类

如何快速创建单例类? [复制]