How to invoke method with CVaListPointer parameters in Swift
Asked Answered
S

1

12

How should I invoke the following method? The method belongs to a class that prints logs.

func log(format: String!, withParameters valist: CVaListPointer)

What I want to achieve, would look like this in Objective-C:

NSLog(@"Message %@ - %@", param1, param2);

Any ideas?

Superlative answered 27/4, 2016 at 18:49 Comment(0)
S
25

CVaListPointer is the Swift equivalent of the C va_list type and can be created from an [CVarArgType] array using withVaList().

Example:

func log(format: String!, withParameters valist: CVaListPointer) {
    NSLogv(format, valist)
}

let args: [CVarArgType] = [ "foo", 12, 34.56 ] 
withVaList(args) { log("%@ %ld %f", withParameters: $0) }

Output:

2016-04-27 21:02:54.364 prog[6125:2476685] foo 12 34.560000

For Swift 3, replace CVarArgType by CVarArg.

Scrummage answered 27/4, 2016 at 18:56 Comment(4)
What can you recommend for a function that takes CVarArg instead of CVaListPointer?Arni
If replace CVarArgType by CVarArg, compiler will show an error because of type, and if you try to cast CVarArg to CVarArgType, you will get a crash.Arni
There is getVaList() method also which return CVaListPointer given a list of CVarArg.Escadrille
@AhmedOsama: According to developer.apple.com/documentation/swift/1539624-getvalist, withVaList is the preferred method.Scrummage

© 2022 - 2024 — McMap. All rights reserved.