Swift 个仅在您导入时应用的扩展
Swift extensions that apply only when you import them
我想要跨项目进行一些 swift 扩展。
不过我想避免类别污染,除非请求这些扩展。
是否可以将它们编写成仅在我完成特定导入后才适用,例如:
import MySwiftExtensions
// Use custom extensions
let x = [1,3,5,7].average()
let y = [1,3,5,7].firstWhere { [=11=] > 3 }
let z = "campervan".make1337()
我可以将这些写成用单个字母 class 包裹的静态方法(例如:ø.average([1,3,5,7])
,如 lodash)来实现相同的目的,但有时您会变得更加简洁来自实例方法的用法。
我想重点关注您报告的内容:“..只有在我完成了某项进口后才适用..”
这也意味着您希望这些扩展只能应用于特定的 class
正如这个有趣的 Apple 博客中所报道的那样 chapter and in the official Apple doc 您可以处理扩展程序的“访问控制”
You can extend a class, structure, or enumeration in any access
context in which the class, structure, or enumeration is available.
Any type members added in an extension have the same default access
level as type members declared in the original type being extended. If
you extend a public or internal type, any new type members you add
will have a default access level of internal. If you extend a private
type, any new type members you add will have a default access level of
private.
Alternatively, you can mark an extension with an explicit access level
modifier (for example, private extension) to set a new default access
level for all members defined within the extension. This new default
can still be overridden within the extension for individual type
members.
/* 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"
}
}
}
标记为私有的扩展成员在定义它们的文件内可用,在该文件外不可用。在定义私有扩展成员的文件之外,任何使用它们的尝试都会导致错误,并且自动完成甚至不会列出它们
// modify default access level to private
private extension UIViewSubClass
{
var helloWorld : String {
get {
return "helloWorld"
}
}
}
我不相信你可以做你想做的事,但我使用以下方法只为实现接口的特定 class 提供功能:
protocol ExampleProtocol {
}
extension ExampleProtocol where Self: UIViewController{
// extend what you need to here
}
您写道:
I have some swift extensions I want to across projects...
当我有想要跨项目使用的代码时,我会创建一个单独的框架来保存该代码。然后,当我想在新项目中使用该代码时,我将框架嵌入到该项目中。或者,出于开发目的,我创建了一个包含项目和框架的工作区。这让我可以同时处理两者,然后只在需要导出框架时才将框架嵌入最终产品中。
框架嵌入或位于同一工作区后,您应该能够将其导入到项目中的任何单个文件中:
import MySwiftExtensions
任何没有导入语句的文件将无法访问扩展。
编辑:
这里a link to a blog that describes how to create a Cocoa Touch Framework. And here is another link详细介绍了如何在开发项目中使用工作区来使用框架
我想要跨项目进行一些 swift 扩展。
不过我想避免类别污染,除非请求这些扩展。
是否可以将它们编写成仅在我完成特定导入后才适用,例如:
import MySwiftExtensions
// Use custom extensions
let x = [1,3,5,7].average()
let y = [1,3,5,7].firstWhere { [=11=] > 3 }
let z = "campervan".make1337()
我可以将这些写成用单个字母 class 包裹的静态方法(例如:ø.average([1,3,5,7])
,如 lodash)来实现相同的目的,但有时您会变得更加简洁来自实例方法的用法。
我想重点关注您报告的内容:“..只有在我完成了某项进口后才适用..” 这也意味着您希望这些扩展只能应用于特定的 class
正如这个有趣的 Apple 博客中所报道的那样 chapter and in the official Apple doc 您可以处理扩展程序的“访问控制”
You can extend a class, structure, or enumeration in any access context in which the class, structure, or enumeration is available. Any type members added in an extension have the same default access level as type members declared in the original type being extended. If you extend a public or internal type, any new type members you add will have a default access level of internal. If you extend a private type, any new type members you add will have a default access level of private.
Alternatively, you can mark an extension with an explicit access level modifier (for example, private extension) to set a new default access level for all members defined within the extension. This new default can still be overridden within the extension for individual type members.
/* 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"
}
}
}
标记为私有的扩展成员在定义它们的文件内可用,在该文件外不可用。在定义私有扩展成员的文件之外,任何使用它们的尝试都会导致错误,并且自动完成甚至不会列出它们
// modify default access level to private
private extension UIViewSubClass
{
var helloWorld : String {
get {
return "helloWorld"
}
}
}
我不相信你可以做你想做的事,但我使用以下方法只为实现接口的特定 class 提供功能:
protocol ExampleProtocol {
}
extension ExampleProtocol where Self: UIViewController{
// extend what you need to here
}
您写道:
I have some swift extensions I want to across projects...
当我有想要跨项目使用的代码时,我会创建一个单独的框架来保存该代码。然后,当我想在新项目中使用该代码时,我将框架嵌入到该项目中。或者,出于开发目的,我创建了一个包含项目和框架的工作区。这让我可以同时处理两者,然后只在需要导出框架时才将框架嵌入最终产品中。
框架嵌入或位于同一工作区后,您应该能够将其导入到项目中的任何单个文件中:
import MySwiftExtensions
任何没有导入语句的文件将无法访问扩展。
编辑:
这里a link to a blog that describes how to create a Cocoa Touch Framework. And here is another link详细介绍了如何在开发项目中使用工作区来使用框架