Are you still using self.interfaceOrientation and getting deprecation warning? Well, don’t. Not only because it is depracated, but it can give you wrong result. Device might be in landscape mode, but a view controller that only supports portrait will remain in portrait. Solution for everything is:

which will not only return correct orientation, but also result is UIInterfaceOrientation enum so you don’t need to change your switches.

Getting “User interaction is not allowed” error in your build task? If yes, solution is very simple. Just login your build user (usually “jenkins”) via the GUI (which means VNC) and open Keychain Access. Select your signing private key, right-click, choose Get Info, change to the Access Control tab and select the “Allow all applications to access this item”.
Now error should be gone.

If you were using NSCoder in Swift 2, I’m pretty sure you used such code:

decoder.decodeObject(forKey: "name") as! String
decoder.decodeObject(forKey: "number") as! Int

Now, in Swift 3, using such construction, will cause:

fatal error: unexpectedly found nil while unwrapping an Optional value

So is there any solution for this? Yes, you need to use explicit methods to integers, floats, bools and some other types. Just rewrite this code as:
decoder.decodeObject(forKey: "name") as! String
decoder.decodeInteger(forKey: "number")

And this error will be gone. Available methods below:
decodeCInt (returns Int32)

So you are trying to send instant message to parent iPhone app and still receiving “Payload could not be delivered”? This happens only if one of those two thing occured:
1. there is no connection to watch (you should check session.reachable in WCSession)
2. your iPhone app is not responding with didReceiveMessage:replyHandler:

Second one is the most probably so how to fix it? There are 2 “didReceiveMessage” methods in WCSessionDelegate protocol, to make it work, you need to implement second one:

so just make it look like:

You just need to respond with NSDictionary. And it works. Really.

iOS developer for 3 years, mostly commercial. PHP developer for 17 years. Loves games, more writing then playing. FilettoRT is first game written for fun, for my doughter. Hope other will also enjoy as she did.

Well, SOAP is kinda old. But if for some reason you need to use it, here is how.

1. Create empty “Single View” project, you can call it “Swift-SOAP-with-Alamofire”
2. Create file named “Podfile” inside, your directory should look like this:
Zrzut ekranu 2016-08-04 o 12.31.15
3. Open “Podfile” and add following content:


target 'Swift-SOAP-with-Alamofire' do
pod 'Alamofire'
pod 'SWXMLHash'
pod 'AEXML'
pod 'StringExtensionHTML'

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|

4. From terminal execute “pod install” (if you don’t have or don’t know what this command does, feel free to google)

5. After command is done, you should see new “Swift-SOAP-with-Alamofire.xcworkspace” file, close your project and open this one instead.

6. At top of your ViewController.swift file add:

import Alamofire
import SWXMLHash
import StringExtensionHTML
import AEXML

7. Below, add new structure for your country:

struct Country {
    var name:String = ""

8. Inside ViewController create new function:

func getCountries(completion: (result: [Country]) -> Void) -> Void {
        var result = [Country]()
        let soapRequest = AEXMLDocument()
        let envelopeAttributes = ["xmlns:SOAP-ENV" : "", "xmlns:ns1" : "http://www.webserviceX.NET"]
        let envelope = soapRequest.addChild(name: "SOAP-ENV:Envelope", attributes: envelopeAttributes)
        let body = envelope.addChild(name: "SOAP-ENV:Body")
        body.addChild(name: "ns1:GetCountries")
        let soapLenth = String(soapRequest.xmlString.characters.count)
        let theURL = NSURL(string: "")
        let mutableR = NSMutableURLRequest(URL: theURL!)
        mutableR.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        mutableR.addValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type")
        mutableR.addValue(soapLenth, forHTTPHeaderField: "Content-Length")
        mutableR.HTTPMethod = "POST"
        mutableR.HTTPBody = soapRequest.xmlString.dataUsingEncoding(NSUTF8StringEncoding)
            .responseString { response in
                if let xmlString = response.result.value {
                    let xml = SWXMLHash.parse(xmlString)
                    let body =  xml["soap:Envelope"]["soap:Body"]
                    if let countriesElement = body["GetCountriesResponse"]["GetCountriesResult"].element {
                        let getCountriesResult = countriesElement.text!
                        let xmlInner = SWXMLHash.parse(getCountriesResult.stringByDecodingHTMLEntities)
                        for element in xmlInner["NewDataSet"]["Table"].all {
                            if let nameElement = element["Name"].element {
                                var countryStruct = Country()
                       = nameElement.text!
                    completion(result: result)
                    print("error fetching XML")

Where actual magic happens.

9. Open your Info.plist as “Code view” and add this to allow loading from HTTP (unless your server has SSL working):






10. Just call:

        self.getCountries { (result) in

and your result will be populated.

You can checkout example project from github at:

Keep in mind that my code is only a way to use, for real apps, you should for example use guard instead of multiple “if let”.

When you dive into .map and .flatMap ocean, you may be confused what is the difference. Consider such example:

let arr = [1,2,3,4,5,6]
print({ return String($0 * 2)+"x" })
print(arr.flatMap{ return String($0 * 2)+"x" })

Both print’s, will give you same result:

["2x", "4x", "6x", "8x", "10x", "12x"]

So why bother? The main details between them, is that flatMap will skip nil values and unwraps them, so the example:

let mapArr ={ (string:Int) -> String? in
    if string < 2 {
        return nil
    return String(string * 2)+"x"
let mapArr2 = arr.flatMap{ (string:Int) -> String? in
    if string < 2 {
        return nil
    return String(string * 2)+"x"

will give following results:

[nil, Optional("4x"), Optional("6x"), Optional("8x"), Optional("10x"), Optional("12x")]
["4x", "6x", "8x", "10x", "12x"]

As you can see now .map output are all optionals with nil as first value is skipped. In .flatMap each value is unwrapped to String and there is no nil values at all.

Testing is good practice, but sometimes you may get into trap. Opposite to Objective-C, in Swift 2.x you don’t need to add each file to your test target, even more – you should not do this at all!

Using Swift 1.x developers had to make every testable class and methods public, which was very annoying. Now, all you have to do, is use:

@testable import ProjectName

in each of your test files (this is required for both unit testing and UI testing). But there is one catch – what if your project name contains spaces like “My First Swift Project”? Fortunately there is simple solution, in most cases just replace space with underscore, but if you want to be sure, go to your app’s target, then “Build settings”, and search for “Module name” – this is string you should use in import.

Swift unit/UI testing

Sooner or later you will face with “Invalid predicate: nil RHS”. What does it mean? Fortunately solution is very simple, somewhere in your code, you are using NSPredicate with “CONTAINS” while your search text is nil. All you have to do is make sure to check and validate text entered by user.

The common mistake is using more then one “@” placeholders, while having only one parameter.