Найден сценарий, в котором я ожидал бы столкновения имени и / или типа, но который проходит и каким-то образом компилируется.
Объект с некоторым свойством может соответствовать протоколу со свойством того же имени и другого типа, когда версия протокола имеет значение по умолчанию, определенное в расширении, и объект соответствует протоколу через (не связанное) расширение.
См. Следующий пример:
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, но написал его здесь, чтобы поделиться открытием и выяснить, упускаю ли я что-нибудь или делаю какие-то ошибочные предположения.