美文网首页
iOS模块(Module)开发--命名空间

iOS模块(Module)开发--命名空间

作者: George2016 | 来源:发表于2018-03-08 14:16 被阅读320次

swift的改进最大的地方之一,就是拥有了Objective-C一直令人诟病的地方没用命名空间,就是所有代码和静态库最终都会编译到同一个域和二进制中。因为这种机制,导致在加入静态库时导致冲突和失败,为了避免这种情况Objective-C的做法是一般加上前缀,比如Apple的UI和NS前缀,各个系统框架加上SK,CG等。 虽然这种解决办法能大大降低冲突,但是加上前缀并不能完全避免冲突。另一种情况就是你想使用两个不同的库,他们分别引用了同一个很流行的库,大家公用的第三方库就会产生冲突。

终于说到swift,swift中由于可以使用命名空间,即使名字相同的类型,只要是来自不同的命名空间,都可以和平共处。 跟C#的显式指定命名空间不同,swift的命名空间基于module而不是显式指明,每个module代表了swift中的一个命名空间,也就是说,同一个target里的类型名称还是不能相同。 在开发中,默认都是添加到主target,所以都处于同一个命名空间,并不能使用相同的名字。 我们需要通过创建cocoa(Touch)Framework方法新建一个module,这样就可以在两个不同的target添加相同的名称类型。

以下两个类分别在两个不同的文件

//WomenModule模块中
//Women.swift
public class Women: NSObject {
    public static func hello() {
        print("hello from framework")
    }
}
//这个文件存在于app的主target中
//Women.swift
class Women: NSObject {
    class func hello() {
        print("hello from app")
    }
}

使用时,出现冲突,只需在类名前加上moduole的名称(也就是target名称):

Women.hello() //输出:hello from app
WomenModule.Women.hello() //输出:hello from framework

需要注意的是,在swift中要使用模块中的类,需要import<#模块名#>
本案例中需要在ViewController中引入WomenModule模块

import UIKit
import WomenModule





在同一个target中,也有另一个解决方法:
将名字重复的类型定义到不同的struct中,以此避免冲突。

struct WomenContainer1 {
    //这个文件存在于app的主target中
    //Women.swift
    class Women: NSObject {
        class func hello() {
            print("hello from WomenContainer1")
        }
    }
}

struct WomenContainer2 {
    //这个文件存在于app的主target中
    //Women.swift
    public class Women: NSObject {
        public static func hello() {
            print("hello from WomenContainer2")
        }
    }
}

使用

WomenContainer1.Women.hello() //输出:hello from WomenContainer1
WomenContainer2.Women.hello() //输出:hello from WomenContainer2

相关文章

  • iOS模块(Module)开发--命名空间

    swift的改进最大的地方之一,就是拥有了Objective-C一直令人诟病的地方没用命名空间,就是所有代码和静态...

  • Module

    Module 模块化 + 命名空间

  • Swift添加命名前缀

    Swift命名前缀 Swift的命名空间是基于模块(module),每一个module代表了一个Swift中的一个...

  • 第十章 模块(Module)和包(Package)

    1 模块(Module)和包(Package) 1.1 命名空间(Namespace) 由于在Python中一切皆...

  • module

    module(模块),主要两大功能:1、提供命名空间2、 Mix-in 扩展功能(模块混入)特性:1、不能拥有实例...

  • 第八章 模块&虚拟环境

    模块 一、模块基础 1、概述 命名空间由于在Python中一切皆为对象(Object), 想要好好理解Module...

  • Spring框架的两个简化XML配置文件的p-namespace

    Spring框架的模块化设计,出现了大量的命名空间。应用开发过程中用到的模块,才需要引入对应的命名空间。 Spri...

  • 命名空间

    简介: 这里要说的命名空间不是基于module的命空间,关于module的命名空间,详情可点这里。在OC中为了做区...

  • 2018-06-28 python命名规范

    Python命名规范 Google Python****命名规范 module_name, 模块 package...

  • iOS Swift命名空间

    Swift的命名空间是以模块来划分的,一个模块表示一个命名空间,我们进行APP开发是,默认添加到主target的内...

网友评论

      本文标题:iOS模块(Module)开发--命名空间

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