Swift 3.0 的 open,public,internal,fi
open
open 修飾的 class 在 Module 內部和外部都可以被訪問和繼承
open 修飾的 func 在 Module 內部和外部都可以被訪問和過載(override)
Public
public 修飾的 class 在 Module 內部可以訪問和繼承,在外部只能訪問
public 修飾的 func 在 Module 內部可以被訪問和過載(override),在外部只能訪問
Final
final 修飾的 class 任何地方都不能不能被繼承
final 修飾的 func 任何地方都不能被 Override
總結:
現在的訪問許可權則依次為:open,public,internal,fileprivate,private。
下面是例子:
ModuleA.framework 中新建一個類ModuleA.swift
import Foundation/// final的含義保持不變public final class FinalClass { }// 這個類在ModuleA的範圍外是不能被繼承的,只能被訪問public class PublicClass { public func testPublic() {} // 這是錯誤的寫法,因為class已經不能被繼承, // 所以他的方法的訪問許可權不能大於類的訪問許可權 open func testOpen() {} // final的含義保持不變 public final func testPublicFinal() {} }// 在ModuleA的範圍外可以被繼承open class OpenClass { // 這個屬性在ModuleA的範圍外不能被override public var size : Int = 0 // 這個方法在ModuleA的範圍外不能被override public func testPublic() {} // 這個方法在任何地方都可以被override open func testOpen() {} ///final的含義保持不變 public final func testPublicFinal() {} }
在 ModuleB.framework 中新建一個類:ModuleB.swift
並且把 ModuleA.framework import 進來
import Foundationimport ModuleA// 這個寫法是錯誤的,編譯會失敗,類訪問許可權標記的是public,只能被訪問不能被繼承class SubA : PublicClass { }// 這樣寫法可以透過,Class訪問許可權為 `open`.class SubB : OpenClass { // 這樣寫也會編譯失敗,因為這個方法許可權為public,不是`open'. override func testPublic() { } // 這個方法因為在SubclassableParentClass中標記為open,所以可以這樣寫 // 這裡不需要再宣告為open,因為這個類是internal的 override func testOpen() { } } open class SubC : OpenClass { // 這種寫法會編譯失敗 override func testPublicFinal() { } // 正確的寫法,方法也需要標記為open open override func testOpen() { } } open class SubE : OpenClass { // 也可以顯式的指出這個方法不能再被override public final override func testOpen() { } }
作者:midmirror
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2820147/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Swift中private、fileprivate、public、open和internal許可權程式碼證明詳解Swift
- Swift2.3升級到Swift3.0小記Swift
- Swift3.0 呼叫C函式-_silen_nameSwift函式
- VulNyx - Internal
- Check the existence of public synonyms Remove the public synonymsREM
- Swift3.0專案升級到4.2遇到問題Swift
- rpm: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such fi...ErrorWhileGCObject
- 如何找到真正的 public 方法
- var和public的區別
- TestFlight Public Link
- public interface View介面和public interface ViewResolver介面介紹View
- PostgreSQL-PostgreSQL中的public(九)SQL
- 【Java小疑問】類和方法 前面新增public和不新增public的區別Java
- 2.2.4.4 Grants to PUBLIC in a CDB
- public-image-mirror
- iOS-常見錯誤:SWIFT_VERSION '5.0' is unsupported, supported versions are: 3.0, 4.0...iOSSwift
- Accessing Internal Members in the UNO FrameworkFramework
- Oracle 12.2 RAC修改public ip address或public ip(subnet (netmask) or interface)Oracle
- 私有屬性的Get Set 與 Public
- 修改 Laravel 的預設 public 路徑Laravel
- Dotnet Core Public API的安全實踐API
- ABAP OPEN SQL裡OPEN CURSOR和SELECT的比較SQL
- How Oracle Store Number internal(zt)Oracle
- ORA-00600: [OSDEP_INTERNAL]
- Oracle RAC修改Scan IP,Public IP的方法Oracle
- 獲取Wi-Fi的SSID
- 在Google的GKE上建立支援Internal Load Balancer的ServiceGo
- Python 訪問限制 private publicPython
- Angular Public API 介面設計AngularAPI
- FI憑證拆分
- Swift 中的 @autoclosureSwift
- Swift中的反射Swift反射
- XMLHttpRequest open()XMLHTTP
- ORA-00600: internal error code, arguments: [13011]Error
- java.sql.SQLException: Fail to convert to internal representationJavaSQLExceptionAI
- RA-03137:TTC protocol internal error:[12333]ProtocolError
- 在其他程式集訪問internal類
- public @interface xxx 定義註解