Skip to content

Instantly share code, notes, and snippets.

@guoye-zhang
Created January 20, 2019 21:57
Show Gist options
  • Save guoye-zhang/b8c82b077d13020d9e48aa9ca8be3b3b to your computer and use it in GitHub Desktop.
Save guoye-zhang/b8c82b077d13020d9e48aa9ca8be3b3b to your computer and use it in GitHub Desktop.
Representing Peano integers using only Swift Optional
func toPeano(_ n: Int) -> Any {
precondition(n >= 0)
if n == 0 {
return nil as Any?
} else {
return toPeano(n - 1) as Any?
}
}
protocol OptionalProtocol {
var isNil: Bool { get }
var unwrapped: Any { get }
}
extension Optional: OptionalProtocol {
var isNil: Bool {
return self == nil
}
var unwrapped: Any {
return self!
}
}
func fromPeano(_ n: Any) -> Int {
let n = n as! OptionalProtocol
if n.isNil {
return 0
}
return fromPeano(n.unwrapped) + 1
}
let p = toPeano(5)
fromPeano(p)
@guoye-zhang
Copy link
Author

OptionalProtocol is necessary because n as! Any? wraps n in an optional instead of casting it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment