Как сделать частную функцию в Swift?
Как сделать частную функцию в 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 нет модификаторов видимости.
На форуме разработчиков авторы языка сказали это в верхней части списка приоритетов.
Цитата 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
и вызвать методы. Функции внутри функций работают, но уродливы...
Ответ 3
Смотрите мой ответ здесь.
Короче говоря, когда вы говорите о создании "частного метода" или "частной функции" в Swift или ObjC (или ruby или java или...), эти методы на самом деле не являются "private". Там нет фактического контроля доступа вокруг них. Любой язык, который предлагает даже небольшую интроспекцию, позволяет разработчикам получать эти ценности извне класса, если они действительно хотят.
Итак, о чем мы говорим, это способ определить открытый интерфейс, который показывает только те функции, которые мы хотим, и "скрывает" остальное, что мы рассматриваем "private".
Механизм быстрого декларирования интерфейсов - это protocol
, и он может быть использован для этой цели.