Swift扩展仅适用于导入它们的情况

我希望跨项目进行一些快速扩展。

尽管我希望避免类别污染,除非请求扩展名。

是否可以编写它们,以便它们仅适用于已完成特定导入的项目,如:

import MySwiftExtensions

// Use custom extensions
let x = [1,3,5,7].average()
let y = [1,3,5,7].firstWhere { $0 > 3 }
let z = "campervan".make1337()

我可以把它们写成单个字母类中包含的静态方法(例如: ø.average([1,3,5,7]) ,就像lodash一样)来实现相同的功能,但有时您会从实例方法中获得更简洁的用法。


你写了:

我希望跨项目有一些快速扩展...

当我有我想跨项目使用的代码时,我创建了一个单独的框架来保存该代码。 然后,当我想在新项目中使用该代码时,我将该框架嵌入到该项目中。 或者,为了开发目的,我创建了一个包含项目和框架的工作空间。 这允许我同时在两者上工作,然后只在需要导出时才将框架嵌入最终产品中。

一旦框架被嵌入或在同一个工作区中,那么您应该能够将它导入到项目中的任何单个文件中:

import MySwiftExtensions

任何没有导入语句的文件都将无法访问扩展。

编辑:

这是一个博客的链接,介绍如何创建一个Cocoa Touch框架。 下面是另一个详细描述如何使用工作区在开发项目中使用框架的链接。


我希望将注意力集中在你所报告的内容上:“如果我已经完成了某个导入,则仅适用于...”这也意味着您希望这些扩展只能应用于特定的类

正如这篇有趣的Apple博客章节和官方Apple文档中所述,您可以处理扩展的“访问控制”

您可以在类,结构或枚举可用的任何访问上下文中扩展类,结构或枚举。 在扩展中添加的任何类型成员与在扩展的原始类型中声明的类型成员具有相同的默认访问级别。 如果您扩展公共或内部类型,则您添加的任何新类型成员都将具有默认的内部访问级别。 如果您扩展私有类型,则您添加的任何新类型成员将具有私有默认访问级别。

或者,您可以使用显式访问级别修饰符(例如,专用扩展名)标记扩展,以便为扩展中定义的所有成员设置新的默认访问级别。 这个新的默认值仍然可以在个别类型成员的扩展名中被覆盖。

/* no access level modifier: default access level will be 'internal' */
    extension UIViewSubClass
    {
        // default access level used: internal
        var helloWorld : String { 
            get {
                return "helloWorld"
            }
        }
    }

    // modify default access level to public
    public extension UIViewSubClass
    {
        // default access level used: public
        var helloWorld : String { 
            get {
                return "helloWorld"
            }
        }
    }

标记为private的扩展名的成员在定义文件的位置可用,并且在该文件之外不可用。 在专用扩展成员被定义的文件之外,任何尝试使用它们都会导致错误,并且自动完成甚至不会列出它们

// modify default access level to private
private extension UIViewSubClass
{

    var helloWorld : String { 
        get {
            return "helloWorld"
        }
    }
}

我不相信你可以做你想要的东西,但我已经使用下面的方法为仅仅实现接口的特定类提供功能:

protocol ExampleProtocol {

}

extension ExampleProtocol where Self: UIViewController{

    // extend what you need to here
}
链接地址: http://www.djcxy.com/p/33709.html

上一篇: Swift extensions that apply only when you import them

下一篇: What are consequences of not calling libusb