Breaking labeled scopes

:  ~ 1 min read

break is used to exit the current scope, for example a for loop:

for i in 1...10 {
	guard i < 9 else { break }
	// Code here.
}

But what if we have nested loops, and we want to break a specific one? Swift has us covered, with labels:

outer: for i in 1...10 {
	inner: for j in 1...10 {
		guard i < 9 else { break outer }
		guard j < 8 else { break inner }
		// Code here.
	}
}

But today I found something interesting: you can label if blocks, as well:

// Works with non optional binding ifs as well.
abCheck: if let a = b() {
	guard a.condition else { break abCheck }
	// Code here.
}

This won't be th […]


Continue reading →

Assign if not nil; if nil, then assign

:  ~ 45 sec read

I always found Ruby's ||= operator interesting, which says (roughly) assign the right hand side to the left hand side, if the latter is nil (or false). But what about assigning the right hand side to the left hand side, if the former is not nil?

Here's my take on these two, with rather intuitive operators (if you ask me, of course):

infix operator ??= // If left is nil, then assign
func ??=<T>(lhs: inout T?, rhs: T?) {
	guard lhs == nil else { return }
	lhs = rhs
}

infix operator =?? // Assign if right is not nil
func =??<T>(lhs: inout T, rhs: T?) {
	guard let rhs = rhs else { return }
	lhs = rhs […]

Continue reading →

A new year is starting soon

My last post for 2016 won't be a technical one; I'd just like to wish everyone a wonderful 2017. I hope you will be healthy, happy, and that your plans and wishes will all work out.

Let's make the next year a great one!

Vertical scrolling parallax

:  ~ 4 min read

If you're using WhatsApp, you probably saw the images have a small parallax effect, in the opposite scrolling direction. This gives the impression that the image is on a deeper level, and the "image container" is a window: if you climb on a chair, it's as if you lowered the window (you scrolled down), and now you can see more of the landscape below the window (it scrolled up); and crouching would have the opposite effect.

One of the biggest downsides to this, is that you need to force your image to be bigger than what the user sees: if you want to have a +/- 10px movement, you need to make it 20 […]


Continue reading →

Thinking outside of the box

:  ~ 1 min read

Recently, I stumbled upon a small problem: we have a product details controller which calls a factory method that creates a view with a few UITextViews that detect a website, a phone, and an address, respectively, but the latter was not working reliably. Said method only needs the product object to be passed in to properly create the view.

One simple solution would have been to also pass the controller as the target, and a local method as the selector, replace the UITextView with a button, set its title to the address and its target & action to the passed in params. Then, inside the product det […]


Continue reading →

Swift mirroring

:  ~ 1 min read

I recently added some tests to LTHRadioButton, and I gave mirroring a try, something I always wanted to do. What's mirroring? As Apple puts it, it's a representation of the sub-structure and optional "display style" of any arbitrary subject instance.

Benedikt has a really nice and comprehensive post about it, so I'll just very shortly cover the children of a mirror. What are children? All the properties of an object, no matter if they are public, internal, or private. And this is where mirroring becomes interesting, and powerful: you can get access to the private / internal properties of an obje […]


Continue reading →

Slightly easier Core Data manipulation

:  ~ 1 min read

Working with Core Data is getting easier and easier, but there are a couple of improvements I'd like to talk about, and I'd like to start with the auto-generated, generic NSFetchRequest. It's a step in the right direction, but the problem is that trying to use it without explicitly declaring its type won't work:

let request = ProductModel.fetchRequest() // <- Ambiguous use of fetchRequest().
let request1: NSFetchRequest<ProductModel> = ProductModel.fetchRequest() // <- Works properly.

I do hope it's just a matter of time until it's solved, but in the meantime, I thought it can be improved a bit […]


Continue reading →

LTHRadioButton

:  ~ 1 min read

I was in need of a radio button recently, and it had to be designed like a Google Material Design radio button. Nothing too fancy, but I wanted to spice it up a little bit, by adding a nice animation. The idea was to:

This is the result:

The library repo can be found here, and it […]


Continue reading →

Adding string attributes slightly easier

:  ~ 1 min read

Say we have a composed string that looks like this:

let date = "22 July, 2017"
let value = "€ 148"
let quantity = 5
let string = "\(quantity) of your items, in value of \(value), have been delivered on \(date)."
// 5 of your items, in value of € 148, have been delivered on 22 July, 2017.

It would be nice to emphasise the important bits, and the usual approach would be to create an NSMutableAttributedString, and to add the required attributes:

let attributedString = NSMutableAttributedString(
  string: string,
  attributes: [
      NSFontAttributeName: UIFont.systemFont(ofSize: 14)
      NSForegroun […]

Continue reading →

Combining protocols

:  ~ 1 min read

Let's say we have a controller that can fetch some data. What would this imply? A loading spinner, the fetching of the data and the update of the UI. We can create a protocol for this, maybe Fetchable:

protocol Fetchable {
  func showSpinner()
  func fetchData()
  func updateUI()
}
[...]
class Controller: UIViewController, Fetchable {
  // showSpinner, fetchData and updateUI are required
}

But showing a spinner and updating the UI could be useful by themselves, so we could extract those into separate protocols:

protocol Loadable {
  func showSpinner()
}

protocol Fetchable {
  func fetchData( […]

Continue reading →