Я знаю, что могу вызывать печать напрямую, но зачем передавать элементы другой функции, чтобы она была как бы обернута массивом? Я хочу знать, почему и как это исправить

func test(items:Any...) {
  print(items)
}

test(1,2,3)     // print [1,2,3]
print(1, 2,3)   // print 1 2 3

Как заставить тестовую функцию работать как функция печати?

5
user49354 6 Сен 2016 в 09:21

3 ответа

Лучший ответ

Наконец, я завершаю тест следующим образом:

func test( items:Any...) {
    for num in items {
        print("\(num) ", separator:" ", terminator:"")
    }
    print("")
}

И это отлично работает, но есть ли лучшие решения?

4
user49354 6 Сен 2016 в 11:47

Если вы хотите, чтобы test выполнял то же самое, что и print, почему бы просто не позвонить print?

func test(args: Any...) {
    print(args)
}

Если вам не разрешено / вы не хотите использовать этот небольшой трюк, вы можете попробовать это. Но это работает только с CustomStringConvertible:

func test(args: CustomStringConvertible...) {

    print(args.map {
        $0.description
    }.joinWithSeparator(" "))

}
1
Sweeper 6 Сен 2016 в 06:35

РЕДАКТИРОВАТЬ: Ах, я не понял ваш вопрос. Swift не написан на Swift, поэтому вы не всегда можете определять функцию таким же образом. Из документации ...

Значения, передаваемые параметру с переменным числом аргументов, становятся доступными в теле функции в виде массива соответствующего типа.

Если вы передадите массив для печати, вы получите тот же эффект, что и с функцией Swift. т.е.

print(1, 2, 3)    - prints 1 2 3
print([1, 2, 3])  - prints [1, 2, 3]

Кроме того, следующее печатает «Массив <Любой>».

func printIt(_ args: Any...) {
    print(type(of: args))
}

Поскольку в Swift единственный выбор для определения функции с переменными аргументами - «...», я понимаю, что это означает, что вы не можете определить функцию таким же образом, как print. Поэтому ваш единственный выбор, если вам нужен тот же результат, - это смоделировать его, преобразовав массив в строку, соединенную пробелами. Ваш вопрос теоретический или у вас есть конкретная цель?

========

Я не уверен, что понимаю ваш вопрос, так как работает следующее:

func printIt(args: Any...) {
    print(args)
}

printIt(args: 1, 2, 3)

В качестве альтернативы, если вы не хотите передавать имя параметра:

func printIt(_ args: Any...) {
    print(args)
}

printIt(1, 2, 3)
-2
Michael 6 Сен 2016 в 23:58