swift - 我们可以为协议(protocol)扩展的方法参数设置默认值吗?如果是这样,我们可以覆盖实现该协议(protocol)的结构上的那些方法吗?

标签 swift protocols

<分区>

我们可以为协议(protocol)扩展的方法参数设置默认值吗?

如果是这样,我们可以在实现该协议(protocol)的结构上重写这些方法吗?

我正在这样做,但我得到了意想不到的结果。这是为什么?谢谢!

import Foundation

protocol Datasource {
    func getLetter(_ uppercased: Bool) -> String
}

extension Datasource {

    func getLetter(_ uppercased: Bool = true) -> String {
        return uppercased ? "B" : "b"
    }
}

struct ADatasource: Datasource {

    func getLetter(_ uppercased: Bool = true) -> String {
        return uppercased ? "A" : "a"
    }
}

let datasource: Datasource = ADatasource()
datasource.getLetter(true) // returns "A"
datasource.getLetter()     // returns "B"   

最佳答案

老实说,不确定为什么 .getLetter() 选择协议(protocol)扩展而不是覆盖实现。

但是,我确实知道一个很好的解决方法可以实现您想要做的事情:

protocol Datasource {
    func getLetter(_ uppercased: Bool) -> String
}

extension Datasource {

    func getLetter() -> String {
        return getLetter(true)
    }

    func getLetter(_ uppercased: Bool) -> String {
        return uppercased ? "B" : "b"
    }
}

struct ADatasource: Datasource {

    func getLetter(_ uppercased: Bool) -> String {
        return uppercased ? "A" : "a"
    }
}

let datasource: Datasource = ADatasource()
datasource.getLetter(true) // returns "A"
datasource.getLetter()     // now returns "A"

关于swift - 我们可以为协议(protocol)扩展的方法参数设置默认值吗?如果是这样,我们可以覆盖实现该协议(protocol)的结构上的那些方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426644/

相关文章:

xcode - 如何跨 View Controller 移动数据?以一种简单的 Swift-iOS8 方式

ios - 无法从委托(delegate)快速获取值

ios - 使用 NSFetchedResultsController 的 CoreData 性能。 UITableView 在数据导入期间卡住

ios - 无法在 Swift 中使用前置摄像头

swift - 使用 attributeText 时多行 UILabel 不会调整文本大小

java - 字节流中协议(protocol)数据单元的动态识别和处理

Swift:类型符合 Equatable 的泛型数组

objective-c - Objective-C 是否具有用于协议(protocol)消息转发的运行时方法?

uitableview - 带有 scopeBar 奇怪行为的 searchBar

ios - Swift - 标签宽度不准确