# 22.open与public

## 在对自己的项目进行组件化的时候遇到这样一个问题

### UI组件中

```swift
public class LedgerNavigationViewController: UINavigationController, StoryboardInitializable {
    public override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
}
```

### 项目中（报错）

* Cannot inherit from non-open class 'LedgerNavigationViewController' outside of its defining module
* Overriding non-open instance method outside of its defining module

```swift
class MapNavigationController: LedgerNavigationViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    weak var selector: LocationSelector?
}
```

## 修改

根据提示，将组件库中的 `public` 改成 `open` ，就可以了。

```swift
open class LedgerNavigationViewController: UINavigationController, StoryboardInitializable {
    open override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()
    }
}
```

## 总结

平时每台用到 `open`，这里遇到问题才很清楚get到他俩的不同，主要区别在继承的控制上。

* public
  * 只能在模块内部被继承
* open
  * 可以再其他模块被继承


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ryukiedev.gitbook.io/wiki/swift/open-yu-public.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
