Swift допускает конфликты имен между свойствами протокола и соответствующими объектами со свойствами не связанных типов - PullRequest
0 голосов
/ 26 января 2019

Найден сценарий, в котором я ожидал бы столкновения имени и / или типа, но который проходит и каким-то образом компилируется.

Объект с некоторым свойством может соответствовать протоколу со свойством того же имени и другого типа, когда версия протокола имеет значение по умолчанию, определенное в расширении, и объект соответствует протоколу через (не связанное) расширение.

См. Следующий пример:

import Foundation

protocol SomeProtocol {
    var someProperty: Int { get }
}

extension SomeProtocol {
    var someProperty: Int { return 3 }
}

struct Thing {
    var someProperty = "string cheese"
}

extension Thing: SomeProtocol {}

let thing = Thing()

print(thing.someProperty) // string cheese
print(thing.someProperty as Int) // 3

Обратите внимание, что перегрузка свойства в Swift обычно вызывает ошибку во время компиляции:

class Thing {
    var what: Int { return 3 }
    var what: String { return "three" }
}

Ошибка гласит:

**Untitled 8.swift:4:6: note: 'what' previously declared here
        var what: Int { return 3 }**

Ясно, что она ведет себя как перегруженная функция, но не похоже, что это поведение намеренно.

Отправил тикет на bugs.swift.org, но написал его здесь, чтобы поделиться открытием и выяснить, упускаю ли я что-нибудь или делаю какие-то ошибочные предположения.

1 Ответ

0 голосов
/ 28 января 2019

На самом деле это похоже на перегрузку на основе свойств.В основном Swift допускает такие вещи:

func compute() -> Int {
    return 42
}

func compute() -> String {
    return "Answer to the Ultimate Question of Life, the Universe, and Everything"
}

, которые можно назвать так:

let number = compute() as Int // 42
let string = compute() as String // "Answer to the Ultimate Question of Life, the Universe, and Everything"

Теперь, вышеописанное невозможно с сохраненными свойствами, так как вы можете иметь только одно сохраненноеname, однако в расширении протокола свойство вычисляется, поэтому оно не нарушает правила хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...