2014-06-05 18 views
18

Jak utworzyć prywatną funkcję w Swift?Jak utworzyć prywatną funkcję w Swift?

Oto przykład:

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() 
    } 

} 

Ale jeśli jest to jedyny sposób, aby to zrobić ....

Odpowiedz

16

W tej chwili nie ma żadnych modyfikatorów widoczności w SWIFT.

Autorzy języków na forum twórców powiedzieli, że znajduje się on na szczycie ich listy priorytetów.

Cytowanie greg Parker Od here:

Zwykle nie obiecuję niczego na przyszłość, ale w tym przypadku robimy wyjątek. Swift będzie miał mechanizmy kontroli dostępu.

W tym samym forum sugerują, że można używać klas zagnieżdżonych, w ten sposób, ale tak naprawdę jest tylko w celu zapobiegania wypełnianiu kodu wewnętrznego metod. Nie są tak naprawdę prywatne w tym sensie, że każdy może utworzyć instancję klasy zagnieżdżonej i uzyskać dostęp do tych metod.

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) 
    } 
} 
4

Alternatywnie, można użyć Nested Classes tak:

// 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) 

wyjściowa:

Customer requests 4 loafs of bread! 
Preparing to make 4 loafs of bread... 
Baking the bread... 
Packaging the freshly baked bread... 

jednak technicznie nie są prywatne, jak ktoś może instancji Bakery.Baker i wywołania metod. Funkcje wewnątrz funkcji działają, ale są brzydkie ...

+0

Jak mogę użyć obiektu 'Bakery' w' Baker' ?? –

+0

Mam to, [tutaj] (http://stackoverflow.com/a/27139165/3110026) –

4

Zobacz moją odpowiedź over here.

Krótko mówiąc, kiedy mówimy o tworzeniu "prywatnej metody" lub "prywatnej funkcji" w Swift lub ObjC (lub ruby, lub java lub ...), metody te nie są tak naprawdę "prywatne". Nie ma rzeczywistej kontroli dostępu wokół nich. Każdy język, który oferuje nawet niewielką introspekcję, pozwala programistom uzyskać wartość poza klasą, jeśli naprawdę tego chcą.

To, o czym mówimy, jest sposobem na zdefiniowanie publicznego interfejsu, który pokazuje tylko taką funkcjonalność, jakiej chcemy, i "ukrywa" resztę, którą uważamy za "prywatną".

Mechanizm szybkiego zgłaszania interfejsów to i może być używany do tego celu.

Powiązane problemy