Подтвердить что ты не робот

Ограничение общего типа для числового типа

Я пытаюсь выяснить, как реализовать ограничение типа для универсального класса (в Swift), который ограничивает типы общих типов только числовыми типами. Например, Double, Int и т.д., Но не строка. Спасибо за любую помощь.

4b9b3361

Ответ 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, который сворачивает несколько числовых типов в один тип слоя.