Я пытаюсь выяснить, как реализовать ограничение типа для универсального класса (в Swift), который ограничивает типы общих типов только числовыми типами. Например, Double, Int и т.д., Но не строка. Спасибо за любую помощь.
Ограничение общего типа для числового типа
Ответ 1
Вы можете указать ограничения типа (используя оба класса и протоколы) для общего класса (тот же синтаксис относится к функциям) с помощью угловых скобок:
class Foo<T: Equatable, U: Comparable> { }
Чтобы указать более одного требования для одного типа, используйте предложение where
:
class Foo<T: UIViewController where T: UITableViewDataSource, T: UITextFieldDelegate> { }
Однако не похоже, что вы можете указывать дополнительные требования в родовом параметре, поэтому одним из возможных решений является создание протокола, который все числовые типы реализуют с помощью расширений, а затем ограничивают ваш класс следующим требованием:
protocol Numeric { }
extension Float: Numeric {}
extension Double: Numeric {}
extension Int: Numeric {}
class NumberCruncher<C1: Numeric> {
func echo(num: C1)-> C1 {
return num
}
}
NumberCruncher<Int>().echo(42)
NumberCruncher<Float>().echo(3.14)
Ответ 2
Strideable
- это самый маленький стандартный протокол, который соответствует стандарту любого стандартного номера, но он также имеет несколько других типов, соответствующих ему.
http://swiftdoc.org/protocol/Strideable/hierarchy/
Или вы можете использовать IntegerType
и FloatingPointType
.
Ответ 3
Вы можете перевернуть свой файл с перечислением:
enum Numeric {
case NInt(Int)
case NUInt(UInt)
case NFloat(Float)
case NDouble(Double)
}
Затем используйте его в своем коде:
func myFunc(x: Numeric) -> Numeric {
switch x {
case let NInt(i):
return i + 1
case let NUInt(u):
return u + 1
case let NFloat(f):
return f + 1
case let NDouble(d):
return d + 1
}
}
Или вы можете просто использовать NSNumber, который сворачивает несколько числовых типов в один тип слоя.