private 與 fileprivate
swift 3.0 以前咖为,在使用extension時(shí),private
修飾的屬性也能被訪問(wèn)到弯菊。而filePrivate
的出現(xiàn)替代了private
,而原有的private
變成真正的私有屬性攻臀,只有在當(dāng)前類中可以使用幔嫂。
class Student {
fileprivate var name = "小明"
private var age = 12
}
extension Student {
func changeName() {
name = "小紅"
// 不能訪問(wèn)age
}
}
public、open和final
1.public
修飾的元素可以被任何人訪問(wèn)瘪撇。但其他module中不可以被override和繼承获茬,而在module內(nèi)可以被override和繼承。
2.open
修飾的原色可以被任何人使用倔既,包括override和繼承恕曲。
/// ModuleA:
// 這個(gè)類在ModuleA的范圍外是不能被繼承的,只能被訪問(wèn)
public class NonSubclassableParentClass {
public func foo() {}
// 這是錯(cuò)誤的寫(xiě)法渤涌,因?yàn)閏lass已經(jīng)不能被繼承佩谣,
// 所以他的方法的訪問(wèn)權(quán)限不能大于類的訪問(wèn)權(quán)限
open func bar() {}
// final的含義保持不變
public final func baz() {}
}
// 在ModuleA的范圍外可以被繼承
open class SubclassableParentClass {
// 這個(gè)屬性在ModuleA的范圍外不能被override
public var size : Int
// 這個(gè)方法在ModuleA的范圍外不能被override
public func foo() {}
// 這個(gè)方法在任何地方都可以被override
open func bar() {}
///final的含義保持不變
public final func baz() {}
}
/// final的含義保持不變
public final class FinalClass { }
/// ModuleB:
import ModuleA
// 這個(gè)寫(xiě)法是錯(cuò)誤的,編譯會(huì)失敗
// 因?yàn)镹onSubclassableParentClass類訪問(wèn)權(quán)限標(biāo)記的是public实蓬,只能被訪問(wèn)不能被繼承
class SubclassA : NonSubclassableParentClass { }
// 這樣寫(xiě)法可以通過(guò)茸俭,因?yàn)镾ubclassableParentClass訪問(wèn)權(quán)限為 `open`.
class SubclassB : SubclassableParentClass {
// 這樣寫(xiě)也會(huì)編譯失敗
// 因?yàn)檫@個(gè)方法在SubclassableParentClass 中的權(quán)限為public吊履,不是`open'.
override func foo() { }
// 這個(gè)方法因?yàn)樵赟ubclassableParentClass中標(biāo)記為open,所以可以這樣寫(xiě)
// 這里不需要再聲明為open调鬓,因?yàn)檫@個(gè)類是internal的
override func bar() { }
}
open class SubclassC : SubclassableParentClass {
// 這種寫(xiě)法會(huì)編譯失敗盖灸,因?yàn)檫@個(gè)類已經(jīng)標(biāo)記為open
// 這個(gè)方法override是一個(gè)open的方法选浑,則也需要表明訪問(wèn)權(quán)限
override func bar() { }
}
open class SubclassD : SubclassableParentClass {
// 正確的寫(xiě)法,方法也需要標(biāo)記為open
open override func bar() { }
}
open class SubclassE : SubclassableParentClass {
// 也可以顯式的指出這個(gè)方法不能在被override
public final override func bar() { }
}
3. fianl
修飾的元素不希望被繼承和重寫(xiě):
- 元素已經(jīng)很成熟,完備了己英。如:md5加密這種類。
- 避免子類繼承和修改造成破壞性后果赚楚。
- 為了讓父類中的某些代碼一定會(huì)執(zhí)行威酒。如:
class Parent {
final func method1() {
//權(quán)限驗(yàn)證(必須執(zhí)行)
method2()
//下面是日志記錄(必須執(zhí)行)
}
func method2(){
//父類的實(shí)現(xiàn)
}
}
class Child : Parent {
//只能重寫(xiě)父類的method2方法,不能重寫(xiě)method1方法
override func method2() {
//子類的實(shí)現(xiàn)
}
}