Wtih Swift 2 now official, it’s good time to give migration from 1.2 a go. It can be longer-than-expected process - automatic updater can only get you so far. Instead of whining about it, I’ll go over some of the smaller features that don’t get as much spotlight as others.
Stepping over/into in the debugger can be really slow. Turns out that Debug navigator is the main culprit here. If it gets slow just hide navigator pane (⌘+0) or change to different navigator and enjoy full speed 1.
WWDC is about to start in 9 hours. Here’s my modest wishlist:
stable tools and iOS - I know, boring,
nice refactoring tools in Xcode - if open source Flashdevelop can do it, Apple can do it!
extensions to Swift language:
Result enum - everybody have been blogging and talking about it for the last year, plus Rust has it,
await and async keywords - we are closely catching up on JavaScript’s 10+ different ways of doing async stuff. It’s such a big part of our work, that support for it should be baked into the language/compiler. See how nice it is in C#:
publicpartialclassMainWindow:Window{// Mark the event handler with async so you can use await in it. privateasyncvoidStartButton_Click(objectsender,RoutedEventArgse){// Call and await separately. //Task<int> getLengthTask = AccessTheWebAsync(); //// You can do independent work here. //int contentLength = await getLengthTask; intcontentLength=awaitAccessTheWebAsync();resultsTextBox.Text+=String.Format("\r\nLength of the downloaded string: {0}.\r\n",contentLength);}// Three things to note in the signature: // - The method has an async modifier. // - The return type is Task or Task<T>. (See "Return Types" section.)// Here, it is Task<int> because the return statement returns an integer. // - The method name ends in "Async."asyncTask<int>AccessTheWebAsync(){// You need to add a reference to System.Net.Http to declare client.HttpClientclient=newHttpClient();// GetStringAsync returns a Task<string>. That means that when you await the // task you'll get a string (urlContents).Task<string>getStringTask=client.GetStringAsync("http://msdn.microsoft.com");// You can do work here that doesn't rely on the string from GetStringAsync.DoIndependentWork();// The await operator suspends AccessTheWebAsync. // - AccessTheWebAsync can't continue until getStringTask is complete. // - Meanwhile, control returns to the caller of AccessTheWebAsync. // - Control resumes here when getStringTask is complete. // - The await operator then retrieves the string result from getStringTask. stringurlContents=awaitgetStringTask;// The return statement specifies an integer result. // Any methods that are awaiting AccessTheWebAsync retrieve the length value. returnurlContents.Length;}voidDoIndependentWork(){resultsTextBox.Text+="Working . . . . . . .\r\n";}}
List may be short, but those features are essential and would make our life easier. With them in place we could place more focus on solving interesting problems.
The Pod source is here: NSErrorPointerWrapper. Read further for motivations and short overview.
Dealing with NSError in Objective-C is clunky at best. You have to create a variable of *NSError type, then pass it by reference to the potentially erroneous method. That variable may or may not be populated as a result of an action. In fact it’s recommended to check the result, not the error, to verify whether the action was successful.