Якщо говорити про створення "приватного методу" у Swift або ObjC (або ruby, java або ...), ці методи насправді не є приватними. Фактичного контролю доступу навколо них немає. Будь-яка мова, яка пропонує навіть невелику інтроспекцію, дозволяє розробникам отримати ці значення поза класом, якщо вони дійсно хочуть.
Тож, про що ми говоримо тут, - це спосіб визначити інтерфейс із загальнодоступною діяльністю, який просто представляє функціонал, який ми хочемо, і "приховує" решту, що ми вважаємо "приватним".
Механізм Swift для оголошення інтерфейсів є protocol
, і він може бути використаний для цієї мети.
protocol MyClass {
var publicProperty:Int {get set}
func publicMethod(foo:String)->String
}
class MyClassImplementation : MyClass {
var publicProperty:Int = 5
var privateProperty:Int = 8
func publicMethod(foo:String)->String{
return privateMethod(foo)
}
func privateMethod(foo:String)->String{
return "Hello \(foo)"
}
}
Пам'ятайте, що протоколи - це першокласні типи і їх можна використовувати в будь-якому місці. І , використовуючи цей спосіб, вони відкривають лише власні інтерфейси, а не інтерфейси, що реалізуються.
Таким чином, доки ви використовуєте MyClass
замість MyClassImplementation
типів параметрів тощо, все повинно просто працювати:
func breakingAndEntering(foo:MyClass)->String{
return foo.privateMethod()
//ERROR: 'MyClass' does not have a member named 'privateMethod'
}
Є деякі випадки прямого присвоєння, коли вам потрібно бути явним з типом, а не покладатися на Swift, щоб зробити висновок про це, але це навряд чи здається вимикачем:
var myClass:MyClass = MyClassImplementation()
Використання протоколів таким чином є семантичним, досить стислим, і на мій погляд дуже схоже на розширення класів, які ми використовували для цієї мети в ObjC.