[swift-users] Wrapping function declarations in #if swift()

Marco S Hyman marc at snafu.org
Fri May 13 01:05:55 CDT 2016


On May 12, 2016, at 10:38 PM, Tyler Fleming Cloutier via swift-users <swift-users at swift.org> wrote:
> 
> Hello everyone,
> 
> It does seem like it is currently possible to wrap just the function declaration in an #if swift() directive like so:
> 
> #if swift(>=3.0)
> public func add(filter filterName: String, path: String) {
> #else // ERROR Expected ā€˜}ā€™ at end of brace statement
> public func addFilter(filterName: String, path: String) {
> #endif

Swift conditional compilation is not line based.   SE-0020 said:

"Like other build configurations, #if swift isn't line-based - it encloses whole statements or declarations. However, unlike the others, the compiler won't parse inactive branches guarded by #if swift or emit lex diagnostics, so syntactic differences for other Swift versions can be in the same file.ā€

https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md

> Is it possible Iā€™m missing how to do this? This is particularly painful in Swift 3 given the change to move have labels on the first function parameter by default. As far as I can see it means that I am required to wrap the entire function body even if nothing else is incompatible with Swift 3.

My solution: a git branch for 2.x and a git branch for 3.x.   Eventually the 2.x branch will wither away.

Marc


More information about the swift-users mailing list