2016-03-12 01:20:34 feng2qing 阅读数 3195
       Objective-C 没有命名空间的,在应用开发时,所有的代码和引用的静态库最终都会被编译到同一个域和二进制中。这样的后果是一旦我们有重复的类名的话,就会导致编译时的冲突和失败。为了避免这种事情的发生,Objective-C 的类型一般都会加上两到三个字母的前缀,比如 Apple 保留的  NS 和 UI 前缀,各个系统框架的前缀  SK (StoreKit),  CG (CoreGraphic) 等。Objective-C 社区的大部分开发者也遵守了这个约定,一般都会将自己名字缩写作为前缀,把类库命名为  AFNetworking 或者  MBProgressHUD 这样。这种做法可以解决部分问题,至少我们在直接引用不同人的库时冲突的概率大大降低了,但是前缀并不意味着不会冲突,有时候我们确实还是会遇到即使使用前缀也仍然相同的情况。另外一种情况是可能你想使用的两个不同的库,分别在它们里面引用了另一个相同的很流行的第三方库,而又没有更改名字。在你分别使用这两个库中的一个时是没有问题的,但是一旦你将这两个库同时加到你的项目中的话,这个大家共用的第三方库就会和自己发生冲突了。

        在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。swift中的命名空间的使用不是一个项目,而是需要跨项目,在一个项目中,都是一个命名空间,在同一个命名空间下,所有全局变量或者函数共享,不需要import,swift开始,官方更多的建议大家使用pod来管理第三方框架(不然拿进来一个框架,整个项目哪哪都能使)


2016-04-20 01:48:55 liangliang2727 阅读数 1390

Objective-C没有命名空间,为了避免冲突,Objective-C的类型一般都会加上两到三个字母的前缀,比如Apple保留的NS和UI前缀,各个系统框架的前缀,各个系统框架的前缀SK(StoreKit),CG(CoreGraphic)等。


Swift的命名空间是基于module而不是在代码中显示地指明,每个module代表了Swift中的一个命名空间。也就是说,同一个target里的类型名称还是不能相同的。


//MyFramework.swift

//这个文件存在于MyFramework.framework中

public class MyClass {

    public class func hello() {

        println("hello from framework")

    }

}


//MyApp.swift

//这个文件存在于app的主target中

class MyClass {

    class func hello() {

        println("hello from app")

    }

}


在使用时,在可能出现冲突的时候,我们需要在类型名称前面加上module的名字(也就是target的名字):


MyClass.hello()

//hello from app


MyFramework.MyClass.hello()

//hello from framework


另一种策略是使用类型嵌套的方法来指定访问的范围。常见的做法是将名字重复的类型定义到不同的struct中,以此避免冲突。这样在不使用多个module的情况下也能取得隔离同样名字的类型的效果:


struct MyClassContainer1 {

     class MyClass {

       class func hello() {

            println("hello from MyClassContainer1")

        } 

    }

}


struct MyClassContainer2 {

     class MyClass {

       class func hello() {

            println("hello from MyClassContainer2")

        } 

    }

}


MyClassContainer1.MyClass.hello()

MyClassContainer2.MyClass.hello()
2018-07-31 10:27:26 Philm_iOS 阅读数 146

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
        }
2016-07-13 13:35:25 xiaowu_csdn 阅读数 164

在用swift时,需要我们动态加载来获取命名空间namespance.我们可以在Build Settings中 搜索product name来查看具体的信息。

具体步骤如下:

      1.动态获取明明空间:
        let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
        
      2.告诉编译器暂时就是AnyClass
        let cls:AnyClass = NSClassFromString(namespace + "." + childControllerName)!
     

     3告诉编译器真实类型是UIViewControlle
        let vcCls = cls as! UITableViewController.Type
       

      4.// 实例化控制器
        let vc = vcCls.init()

2018-03-15 09:15:29 qq_35612929 阅读数 293

动态获取命名空间


前提知识点: 先说一下获取命名空间的作用,在Swift的项目中,打印当前类的时候,会发现,相比OC,类名前多了一个命名空间。因此,在调用NSClassFromString(“”)这类方法的时候,在类名前,必须加上命名空间. 。举个小例子如下:

//项目名称:starProduct
//要获取的类:AAAViewController
let aaa = NSClassFromString("starProduct.AAAViewController")

但是,命名空间在Build Settings 里面的 Product Name 里是可以修改的。所以,为了保证项目的稳定性,必须要动态的获取命名空间:

//动态获取命名空间
let ns = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
//所以按上面的要求,可以这么写
let aaa = NSClassFromString(ns + ".AAAViewController")
//实际应用中,一般类名也是传过来的,所以假设传过来的参数名为className。
let aaa = NSClassFromString(ns + "." + className)

Swift 命名空间

阅读数 7

swift 修改命名空间

阅读数 302

博文 来自: Baby_come_here
没有更多推荐了,返回首页