2015-09-13 1 views
0

Я попытался это с раскадровки с Xcode 7 GM Seed:Что такое поведение частного контроля доступа для класса Quick?

import UIKit 

public class C { 
    let _secret = arc4random_uniform(1000) 

    private func secret() -> String { 
     return "\(_secret) is a secret" 
    } 

} 
let c1 = C() 
c1.secret() 

Это компилируется и дал мне «секрет». Таким образом, это расстраивает мое понимание контроля доступа для класса и объекта Swift. Почему это происходит?

+2

Приватный доступ ограничивает использование объекта в его собственном определяющем исходном файле. Все это задокументировано в книге Swift в главе «Контроль доступа». –

ответ

3

В Swift private означает доступный только в том же исходном файле, который вы делаете. Если код в вашем вопросе содержался в файле C.swift, и вы попытались бы получить доступ к методу secret из другого файла Swift, вы получили бы ошибку времени компиляции.

Подробнее о различных модификаторах доступа можно узнать в official documentation.

2

Swift 4 Обновленный ответ:

Есть два различных контроля доступа: fileprivate и частных.

fileprivate можно получить из всех своих файлов.

приватный может быть доступен только из их единого объявления и расширений.

Например:

// Declaring "A" class that has the two types of "private" and "fileprivate": 
class A { 
    private var aPrivate: String? 
    fileprivate var aFileprivate: String? 

    func accessMySelf() { 
     // this works fine 
     self.aPrivate = "" 
     self.aFileprivate = "" 
    } 
} 

// Declaring "B" for checking the abiltiy of accessing "A" class: 
class B { 
    func accessA() { 
     // create an instance of "A" class 
     let aObject = A() 

     // Error! this is NOT accessable... 
     aObject.aPrivate = "I CANNOT set a value for it!" 

     // this works fine 
     aObject.aFileprivate = "I CAN set a value for it!" 
    } 
} 

Для получения дополнительной информации обратитесь Access Control Apple's documentation, также вы можете проверить this answer.