Можно ли напечатать тип функции в Swift?

Я хочу напечатать тип функции.

func thanksTo(name: String) {
    print("Thanks, \(name)")
}

printType(thanksTo)    // expected to print "Function (String) -> ()"

Есть ли какая-либо функция в Swift, которая ведет себя как printType?

Ответ 1

Свифт 3 и позже

Начиная с Swift 3, __FUNCTION__ устарела. Вместо этого используйте #function вместо __FUNCTION__.

(Спасибо, @jovit.royeca.)


Swift 2.2 и более ранние

У вас есть несколько вариантов:

  1. print(__FUNCTION__) выведет functionName() если у функции нет аргументов.
  2. print(__FUNCTION__) выведет functionName (без скобок), если функция имеет один или несколько аргументов.
  3. print(functionName.dynamicType) выведет (() → Swift.Int) → Swift.Int для этой гипотетической функции:

    func functionName(closure: () -> Int) -> Int {
    
    }
    

Таким образом, для реализации желаемой функциональности вашей функции printType вы можете использовать комбинацию из Варианта 2 и Варианта 3.

Ответ 2

Swift 3 имеет интересную новую печать, которая печатает тип всего, что вы его кормите. Он в основном печатает ту же информацию, которая содержится в завершении кода.

print(type(of: functionName())) // prints the return type of a function
// Array<Float>

Вот метод свертки из структуры Accelerate с некоторыми свойствами.

vDSP_conv(newXin, 1, kernel.reversed(), 1, &res, 1, vDSP_Length(T), vDSP_Length(N))

print(type(of: vDSP_conv)) // prints the method arguments.
// ((UnsafePointer<Float>, Int, UnsafePointer<Float>, Int, UnsafeMutablePointer<Float>, Int, UInt, UInt)) -> ()

print(type(of: kernel)) // prints the property type.
// Array<Float>

print(type(of: kernel.reversed())) // prints the property type and method type from the Swift Standard Library.
// ReversedRandomAccessCollection<Array<Float>>

Прохладный материал!

Ответ 3

попробуйте это

println(thanksTo.dynamicType)

Ответ 4

Теперь он печатает (#function) в Xcode 7.3.1

См. Примечания к выпуску для быстрой настройки в расположении ниже.

https://github.com/apple/swift/blob/master/CHANGELOG.md

Изменение произошло в Swift 2.2

enter image description here