我想要跨项目进行一些快速扩展。
我想避免类别污染,除非要求扩展。
是否可以编写它们以便它们仅在我执行了某些导入时才适用,例如:
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>
答案 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
}