Можем ли да имаме стойности по подразбиране за аргументи на метода за разширения на протокол? Ако е така, можем ли да отменим тези методи на структури, които имплементират този протокол?

Можем ли да имаме стойности по подразбиране за аргументи на метода за разширения на протокол?

Ако е така, можем ли да отменим тези методи на структури, които имплементират този протокол?

Правя го, но имам неочаквани резултати. Защо така? Благодаря!

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"   

person offcourse    schedule 29.01.2019    source източник
comment
Възможен дубликат на Внедряване на функция с параметър по подразбиране, дефиниран в протокол   -  person Hamish    schedule 29.01.2019


Отговори (2)


Честно казано, не съм сигурен защо .getLetter() избира разширението на протокола вместо презаписаната реализация.

Знам обаче добро решение, което ще постигне това, което се опитвате да направите:

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"
person XmasRights    schedule 29.01.2019

Ако си спомням правилно, това е заради динамичното изпращане срещу статичното изпращане. Методите, декларирани в разширенията на протокола, не се изпращат динамично.

Тъй като методът без ясен аргумент не е дефиниран в протокола, извикването се изпраща статично. И тъй като сте дефинирали datasource като тип Datasource, внедряването на протокола се извиква вместо изпълнението на ADatasource.

Ако премахнете изричния тип и просто използвате let datasource = ADatasource(), той ще работи както се очаква.

person Rengers    schedule 29.01.2019