Swift: #warning equivalent

Edit

As of Swift 4.2, language level support is available for both build warnings and errors.

#warning("Warning description")
#error("Throws a build error")

Original Answer

Quick, dirty, and oh so elegantly simple all at the same time.

// Description of what you need to fix

var FIX_ME__πŸ› πŸ› πŸ› : AnyObject

Throws a warning that 'FIX_ME__πŸ› πŸ› πŸ› ' was never used.

You can add emoticons to the variable name if you like... I often use 😱 and πŸ› , for something that really needs fixing I'd even consider πŸ’©. You can replace FIX_ME__ with whatever you want: ALGORITHM_NEEDS_REVIEW, BugID_148, or JOHNNY_YOU_BROKE_THIS are some examples.

Quick, no setup, concise, and emoticons can even add humour/personality to your code. Sometimes the most simple solution is the best solution.


In the future, Apple devs may very well release a //WARNING: landmark, or provide the functionality for another named landmark.

To envoke this functionality with Swift in Xcode today however, you could do the following as outlined by Ben Dodson & Jeffrey Sambells:

Add a new Run Script to your target's build phases tab (project settings > build phases > '+' > new run script phase), and paste the following code in the empty box:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

This will force Xcode to flag a warning at compile time for any // TODO: or // FIXME: comments you markup.

Alternatively, you could amend TAGS with a custom tag: TAGS="WARNING:" in the above code which would keep the default behaviour for TODO & FIXME and would raise a compile time warning on any comments marked-up as // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode-warnings-from-todo-comments

EDIT: 18/11/14

@david-h raised a good point in his comment. If you wanted to only raise these warnings in a specific build configuration, you could do the following:

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Alternatively, you could use "Release" rather than "Debug" to target production builds only.


Post WWDC 2018 Update

Starting with Xcode 10 and Swift 4.2 you will now be able to use #warning again like so:

#warning("TODO: Clean up this code after testing")

This will show up as a warning in Xcode just as expected!

This works even in combination with #if checks, for example the following will only show a warning if your target platform is iOS:

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

There's also #error if you want your build to fail.


Pre WWDC 2018 Answer

In Swift using XCode 6 you can use different kinds of landmarks for different purposes. Here's what Apple says about it:

Xcode now supports //MARK:, //TODO: and //FIXME: landmarks to annotate your code and lists them in the jump bar.

So for setting a warning with a description you would use something like this:

//TODO: Clean up this code after testing

If you just want to set a short mark (assuming you will remember what to do), use this:

//FIXME

EDIT: These landmarks however only appear in the jump bar of XCode which might not be what you wish for and what one would expect – especially from the //TODO: and //FIXME marks. I've filed a radar on that: #17776817. Hopefully Apple will add this in the coming builds in XCode 6.

SOLUTION (EDIT 2): If you install the Swift Linter via Homebrew (run brew install swiftlint after a brew update) and add the suggested build script to your project, then you will see all your TODO and FIXME landmarks appear as warnings within Xcode. SwiftLint will even add some more warnings/errors that you can configure to fit your needs – I can only recommend using SwiftLint and it solves this problem in a great way!


Still not added by Apple team yet. What I decided to do is probably a cheating, but at least it does show me a FIXME message. So what I do is declare FIXME() function in Swift file:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

and when I call it from any other function it does show a warning, e.g.

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

enter image description here

For Swift 2 use

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")

Look at this article.

You can write your own script which will highlight all tags.

TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"

This results to: enter image description here