美文网首页
swift碰到的坑

swift碰到的坑

作者: 只写Bug程序猿 | 来源:发表于2017-12-12 15:38 被阅读0次

之前接触学习swift是2的版本,由于长时间不用,所以一些基本的用法都忘记了,最近项目不是很忙又重新学习swift4,刚开始就遇到一个问题,oc中大家可能都知道从字符串获取类名NSClassFromString,oc中直接传入字符串就会得到一个类名但是swift中用法就显得复杂一些,swift有一个命名空间的存在,虽然说官方并没有说支持nameSpace,但是有module或者target来实现nameSpace相似的功能,
xcode中每建立一个target可以当做是一个模块(module),target和 bundle名称一致,但是有一个很操蛋的情况,我们target名称包含"-"的时候,会得不到类,系统会自动的把"-"替换为"_",原来的名称xx-xx-xx,被转换为了xx_xx_xx,所以当项目名称中包含"-"时,使用NSClassFromString的时候要把获取到的target中的"-"替换为"_",不过一些特殊字符最好不要用,以免出现各种不好找的bug

func getVCByClassString(_ childControllerName:     String) ->  UIViewController?{
     // 1.获取命名空间
     var nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
     nameSpage = nameSpage.replacingOccurrences(of: "-", with: "_");
     guard let childVcClass = NSClassFromString(nameSpage + "." +  childControllerName) else {
         print("没有获取到对应的class")
         return nil;
     }
     guard let childVcType = childVcClass as? UIViewController.Type else {
         print("没有得到的类型")
         return nil;
     }
     //根据类型创建对应的对象
     let vc = childVcType.init()
     return vc
 }
 func getVCByClassString(_ childControllerName:   String) ->  UIViewController?{
      guard let nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
            print("没有命名空间")
            return nil;
        }

        guard let childVcClass = NSClassFromString(nameSpage + "." + childControllerName) else {
            print("没有获取到对应的class")
            return nil;
        }

        guard let childVcType = childVcClass as? UIViewController.Type else {
            print("没有得到的类型")
            return nil;
        }

        //根据类型创建对应的对象
        let vc = childVcType.init()

        return vc
    }

相关文章

网友评论

      本文标题:swift碰到的坑

      本文链接:https://www.haomeiwen.com/subject/iaknixtx.html