# swift命名空间

1、在oc中我们通过类名能非常方便的动态到创建对象。

```
- (id)productWithClassName:(NSString *)claName{

    class cla = NSClassFromString(claName);
    if (cla) {

        id obj = [[cla alloc] init];
        return obj;
    }
}
```

但是如果将这段代码直接转换成swift代码，一运行是会直接闪退的，因为swift中是存在命名空间的。swift中 `import UIKit` 等都是导入对应到命名空间，swift中同一个命名空间类是不需要 import 。swift中类的完成命名应该是"命名空间"+`.`+"类名"。

下面是一个通过配置 tableView的dataSource 来跳转不同到界面

```
class ViewController: UIViewController {

    public var dataSource:[[String:String]] = [["title":"pageOne","class":"PageOneViewController"],
                                               ["title":"pageTwo","class":"PageTwoViewController"]];
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.title = "首页"
        let tableView:UITableView = UITableView.init(frame: self.view.bounds, style: UITableViewStyle.plain);
        tableView.delegate = self;
        tableView.dataSource = self;
        self.view.addSubview(tableView);

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

```
extension ViewController:UITableViewDelegate,UITableViewDataSource{

    func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return dataSource.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        var cell :UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "cellId")
        if cell == nil {

            cell = UITableViewCell.init(style: .default, reuseIdentifier: "cellId")
        }
        let dic:Dictionary = dataSource[indexPath.row]
        cell?.textLabel?.text = dic["title"]
        return cell as UITableViewCell!;
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        tableView.deselectRow(at: indexPath, animated: true)

        let vcName:String = dataSource[indexPath.row]["class"]!
        let title:String  = dataSource[indexPath.row]["title"]!
        // 0.获取命名空间
        guard let executable = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
            return
        }

        // 1.获取对应的类
        guard let childVcClass : AnyClass = NSClassFromString(executable + "." + vcName) else {
            return
        }

        let childClass = childVcClass as! UIViewController.Type
        let childVc = childClass.init()
        childVc.title  = title;
        self.navigationController?.pushViewController(childVc, animated: true);

    }
}
```

关键代码： 先动态取到当前项目的命名空间， 然后通过命名空间和类名拼成完整到类名

```
  // 0.获取命名空间
        guard let executable = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
            return
        }
            // 1.获取对应的类
        guard let childVcClass : AnyClass = NSClassFromString(executable + "." + vcName) else {
            return
        }
```


---

# 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://philm.gitbook.io/philm-ios-wiki/mei-zhou-yue-du/swift-ming-ming-kong-jian.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.
