Я считаю, что вы слишком усложнили проблему, потребовав возможность передавать нетипизированный nil
(которого на самом деле не существует; даже nil
имеет тип). Хотя подход в вашем ответе, кажется, работает, он позволяет создавать типы ??
из-за необязательного продвижения. Вам часто везет, и это работает, но я видел, как это взрывалось очень разочаровывающим образом, и вызывалась неправильная функция. Проблема в том, что String
можно неявно повысить до String?
, а String?
можно неявно повысить до String??
. Когда ??
проявляется неявно, почти всегда следует путаница.
Как указывает MartinR, ваш подход не очень интуитивен в отношении того, какая версия вызывается. UnsafePointer
тоже NilLiteralConvertible
. Так что сложно рассуждать о том, какая функция будет вызываться. «Сложно рассуждать» делает его вероятным источником запутанных ошибок.
Единственный раз, когда ваша проблема существует, это когда вы передаете литерал nil
. Как отмечает @Valentin, если вы передаете переменную, которая оказывается be nil
, проблем нет; вам не нужен особый случай. Зачем заставлять вызывающую сторону передавать нетипизированный nil
? Просто пусть вызывающий ничего не передает.
Я предполагаю, что somethingGeneric
делает что-то действительно интересное в случае передачи nil
. Если это не так; если код, который вы показываете, указывает на реальную функцию (т. е. все завершается проверкой if (input != nil)
), то это не проблема. Только не звони somethingGeneric(nil)
; это доказуемый отказ от операции. Просто удалите строку кода. Но я предполагаю, что есть какая-то "другая работа".
func somethingGeneric<T>(input: T?) {
somethingGeneric() // Call the base form
if (input != nil) {
print(input!);
}
}
func somethingGeneric() {
// Things you do either way
}
somethingGeneric("Hello, World!") // Hello, World!
somethingGeneric() // Nothing
person
Rob Napier
schedule
16.03.2016