FormationLayout and Protocol-Oriented Programming in Swift

My favourite talk of WWDC 2015 was Protocol-Oriented Programming in Swift. However, when Dave Abrahams says, “Swift is the first Protocol-Oriented Programming language”, I didn’t get it. Isn’t protocol in Swift the same as interface in other languages? Isn’t “Protocol-Oriented Programming” the same as one of the SOLID principles - Dependency inversion principle - “Depend upon Abstractions. Do not depend upon concretions”? It is not new at all.

Then in the later part of the talk I learned from Dave how powerful protocol is in Swift 2, especially Self Requirement and Protocol Extensions, and why we should use protocols instead of classes for abstraction. I felt excited and already Protocol-Oriented myself after watching the talk. I need to do something to check if I really am :)

So here comes FormationLayout, a Protocol-Oriented AutoLayout library in Swift 2. Now I will show you how I made it Protocol-Oriented and why it is good.

Read More

BDD Demo with GameOfLife in Swift and Quick

BDD(Behavior Driven development) was firstly developed by Dan North as a response to the issues encountered teaching test-driven development:

  • Where to start in the process
  • What to test and what not to test
  • How much to test in one go
  • What to call the tests
  • How to understand why a test fails

That was version 1 of BDD in mid-2003. BDD v3 now is more about communications between all different roles in agile teams using the same language: GivenWhenThen([1] [2]).

I made some videos before to demonstrate TDD on Android platform using Conway’s Game of Life as an example. This time I will use this example again to demonstrate BDD on iOS platform in Swift and a BDD framework Quick.
(Code at GitHub)

1. Create Project and Add Quick Framework

Read More

Tips of using Realm iOS

I am trying to use Realm on an iOS project by CocoaPods. After hours debugging, I finally got it working and there are 3 tips I’d like to record.

Tip 1: Work on other CocoaPods library project

I am using CocoaPods to separate the iOS project to libraries. Realm works fine with the main app and libraries separately, but the libraries couldn’t be compiled as Pods project in the main app. I solved this problem by adding Realm framework to the Pods project and add it to the library targets myself. But I need to do this every time after I run pod update which I need to do frequently. I need to write a script to do it for me later.

(Update 21.09.2014: Realm 0.85.0 use source code instead of framework file so Tip 1 is not needed now)

Tip 2: Runtime errors when try to write Realm model objects

If you need to use a RLMArray of one model object SomeObject in another, you need to use RLM_ARRAY_TYPE(SomeObject) and declare it as RLMArray<SomeObject> *someObjects. At first I couldn’t get it work so I marked the someObjects property ignored. Then I can’t get it work any more and the runtime error tell me nothing about what happened. The problems is, when you change one RLMObject schema and you already stored some data as the old schema, you need to delete the old Realm file (or migrate).

Tip 3: Do not work with <NSObject> protocol

After I upgraded to Realm 0.85.0 and Xcode 6, Realm complained about a ‘hash’ property. After debugging for a while I found out that it is because some of my RLMObjects conform to <NSObject> protocol. It was fine with Realm 0.83.0 and Xcode 5. I’m not sure if it’s because of my upgrade of Realm or Xcode but it was fixed just by removing the <NSObject> protocol from the RLMObjects.