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

2018-03-08  本文已影响320人  George2016

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
上一篇 下一篇

猜你喜欢

热点阅读