相关疑难解决方法(0)

如何在Swift中正确使用类扩展?

在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社区如何看待扩展.你怎么看?有一个银色的小礼物吗?

system-design ios swift swift-extensions

16
推荐指数
2
解决办法
8372
查看次数

不支持从扩展覆盖非@objc声明

似乎无处不在,我开始遇到与我经常使用的两个扩展功能相关的数百个错误。

我尝试注释掉出现此错误之前的所有新代码。我还尝试清洁构建文件夹。我如何才能克服这篇文章标题中发现的错误?当我成功使用这些扩展包几个月后,为什么会随机出现?

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)

ios swift

8
推荐指数
1
解决办法
4381
查看次数

我自己的自定义类中的扩展

我正在阅读另一个SO问题,Swift do-try-catch语法.在他的回答中,rickster为OP的自定义类创建了一个扩展.Konrad77评论说这是"保持代码清洁的绝佳方式".我尊重他们的知识,这让我相信我在自己的代码中错过了一点.

是否还有其他好处(除了清洁度)或为我创建的课程创建扩展的原因?我可以直接将相同的功能放入类中.如果我是唯一一个使用该课程的人,或者其他人将访问它,答案是否会改变?

swift

2
推荐指数
1
解决办法
704
查看次数

标签 统计

swift ×3

ios ×2

swift-extensions ×1

system-design ×1