在Swift中,我历史上使用扩展来扩展封闭类型并提供方便的,无逻辑的功能,如动画,数学扩展等.但是,由于扩展是硬依赖性遍布整个代码库,我总是在实现之前三次思考某事作为延伸.
最近,我已经看到Apple建议在更大程度上使用扩展,例如将协议实现为单独的扩展.
也就是说,如果你有一个实现协议B的A类,你最终会得到这样的设计:
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
Run Code Online (Sandbox Code Playgroud)
当你进入那个兔子洞时,我开始看到更多基于扩展的代码,例如:
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
Run Code Online (Sandbox Code Playgroud)
我的一部分就像你在单独的扩展中实现协议时获得的构建块.它使得该类的独立部分非常独特.但是,只要继承此类,就必须更改此设计,因为无法覆盖扩展函数.
我认为第二种方法是......有趣.一旦它成功,那就是你不需要注释每个私有属性并将其作为私有属性,因为你可以为扩展指定.
但是,这种设计还会分割存储和非存储的属性,公共和私有函数,使类的"逻辑"更难遵循(我知道写较小的类).这与子类化问题一起使我在延伸仙境的门廊上停了下来.
很想听听Swift社区如何看待扩展.你怎么看?有一个银色的小礼物吗?
似乎无处不在,我开始遇到与我经常使用的两个扩展功能相关的数百个错误。
我尝试注释掉出现此错误之前的所有新代码。我还尝试清洁构建文件夹。我如何才能克服这篇文章标题中发现的错误?当我成功使用这些扩展包几个月后,为什么会随机出现?
extension UITableViewCell {
public func getSize(large: CGFloat, medium: CGFloat, small: CGFloat) -> CGFloat {
var size = CGFloat()
let screenHeight = Int(UIScreen.main.bounds.height)
if screenHeight >= 800 {
size = large
} else if screenHeight >= 600 {
size = medium
} else {
size = small
}
return size
}
public func formatPrice(_ price: Int) -> String {
let lastDigit = price % 10
var stringPrice = ""
if lastDigit == 0 {
stringPrice = "$\(Double(price) / 100)0" …Run Code Online (Sandbox Code Playgroud) 我正在阅读另一个SO问题,Swift do-try-catch语法.在他的回答中,rickster为OP的自定义类创建了一个扩展.Konrad77评论说这是"保持代码清洁的绝佳方式".我尊重他们的知识,这让我相信我在自己的代码中错过了一点.
是否还有其他好处(除了清洁度)或为我创建的课程创建扩展的原因?我可以直接将相同的功能放入类中.如果我是唯一一个使用该课程的人,或者其他人将访问它,答案是否会改变?