Я использую версию XCode 11.3.1 (11C504)
Я пытаюсь создать обобщенную c функцию в Swift, которая отклоняет свой параметр, если такой параметр не является необязательным.
В следующем коде я ожидал, что система сообщит об ошибках во всех вызовах onlyCallableByAnOptable()
, совершенных внутри test()
, поскольку ни один из них не обеспечивает необязательное значение в качестве параметра.
Однако система сообщает о непротокольном соответствии, только если я удаляю расширение Optional
, соответствующее Optable
!
Для меня это означает, что система рассматривает любые значения как Optional
, независимо от того,
Я что-то не так делаю?
(Кстати, следующий код раньше работал, как и ожидалось, в более ранних версиях Swift. Я только недавно обнаружил, что он перестал работать, потому что пропускал не-1031 * go. )
protocol Optable {
func opt()
}
func onlyCallableByAnOptable<T>( _ value: T) -> T where T: Optable {
return value
}
// Comment the following line to get the errors
extension Optional: Optable { func opt() {} }
class TestOptable {
static func test()
{
let c = UIColor.blue
let s = "hi"
let i = Int(1)
if let o = onlyCallableByAnOptable(c) { print("color \(o)") }
//^ expected ERROR: Argument type 'UIColor' does not conform to expected type 'Optable'
if let o = onlyCallableByAnOptable(s) { print("string \(o)") }
//^ expected ERROR: Argument type 'String' does not conform to expected type 'Optable'
if let o = onlyCallableByAnOptable(i) { print("integer \(o)") }
//^ expected ERROR: Argument type 'Int' does not conform to expected type 'Optable'
}
}