只有在导入

时间:2016-04-29 17:32:19

标签: swift objective-c-category swift-extensions

我想要跨项目进行一些快速扩展。

我想避免类别污染,除非要求扩展。

是否可以编写它们以便它们仅在我执行了某些导入时才适用,例如:

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)来实现同样的目的,但有时你会从实例方法中获得更简洁的用法。 / p>

3 个答案:

答案 0 :(得分:2)

您写道:

  

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

当我有我希望跨项目使用的代码时,我创建了一个单独的框架来保存该代码。然后,当我想在新项目中使用该代码时,我将框架嵌入到该项目中。或者,为了开发目的,我创建了一个包含项目和框架的工作区。这使我可以同时处理这两个问题,然后只有在出口时才将框架嵌入到最终产品中。

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

import MySwiftExtensions

任何没有import语句的文件都无法访问扩展名。

编辑:

以下是a link描述如何创建Cocoa Touch Framework的博客。这里是another link,它详细描述了如何使用工作空间在开发项目中使用框架。

答案 1 :(得分:1)

我想把注意力集中在你报道的内容上:" ..只有在我做了某种导入时才适用。" 这也意味着您希望这些扩展只能应用于特定的类

正如在这个有趣的Apple博客chapter以及官方Apple doc中所报告的那样,您可以处理"访问控制"你的扩展名

  

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

     

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

/* 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"
        }
    }
}

答案 2 :(得分:0)

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

protocol ExampleProtocol {

}

extension ExampleProtocol where Self: UIViewController{

    // extend what you need to here
}