2015-10-15 61 views
4

爲什麼需要在一個公共接入控制的viewController覆蓋viewDidLoad中之前設置公共重寫viewDidLoad中之前設置公共爲什麼需要在一個公共接入控制的viewController

public class customViewController: UIViewController { 
    override public func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

如果我刪除了市民,Xcode中會給出錯誤警告!

回答

6

的錯誤信息是非常明確的:

Overriding instance method must be as accessible as the declaration it overrides.

這意味着方法不能比的方法,其較低的訪問級別覆蓋。

例如給出這個類:

public class Superclass { 
    internal func doSomething() { 
     ... 
    } 
} 

不能然後覆蓋doSomething與比interal較少訪問的方法。例如

public class Subclass : Superclass { 
    // error 
    private override func doSomething() { 
    } 
} 

但是,您可以覆蓋一個方法,使之更加訪問

public class Subclass : Superclass { 
    public override func doSomething() { 
     // You can even call the internal method in the superclass 
     super.doSomething() 
    } 
} 

reference documentation有很多細節上的這一點,但似乎離開這個關係的意義。

+1

我認爲覆蓋訪問控制級別不能低於類級別和方法級別之間的最低級別。 – Dennis

1

here從注意到

Public訪問使得能夠從他們的定義模塊任何源文件中使用的實體,並且還從該導入定義模塊另一模塊中的源文件。在爲框架指定公共接口時,通常使用公共接口。

Internal訪問使實體能夠在來自其定義模塊的任何源文件中使用,但不能在該模塊之外的任何源文件中使用。定義應用程序或框架的內部結構時,通常使用內部訪問。

Private訪問限制實體對封閉聲明的使用。使用私人訪問來隱藏特定功能的實現細節。

File-private訪問限制實體對其自己定義的源文件的使用。

你需要公共修飾符嗎?你可以寫這樣的:

class customViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

沒有警告

+0

給出的示例代碼實際上創建了一個內部的customViewController類,因爲這是沒有指定時的默認訪問級別。 –

+0

謝謝!我瞭解訪問控制級別之間的區別。我真的很困惑,爲什麼我加上公開給我一個錯誤。我認爲覆蓋訪問控制級別不能低於該級別和方法級別之間的最低級別。 – Dennis

+0

在Swift 3中,私有訪問限制了實體對封閉聲明的使用,而fileprivate限制了對源文件的使用。 – nbloqs

0

你類聲明:

public class customViewController: UIViewController

這將打開customViewController高達public訪問(公開繼承)

寫這給你的錯誤:

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

這裏發生了什麼事是默認訪問級別之間的不愉快交互的方法以及繼承如何處理訪問級別。

A subclass must preserve the accessibility of its superclass’s methods wherever the subclass might be used directly. Otherwise, we would violate the substitution principle that allows us to treat all kinds of UIViewController as just another UIViewController .

相關問題