Latest 0.1.0
License MIT
Platforms ios 8.0, osx 10.9, tvos 9.0, requires ARC

Build Status
Carthage compatible

Statically-typed key for Swift.

Design Goal

A design goal of TypedKey is to provide statically typed key-value interface to Cocoa APIs.

At a Glance

Key Definition
let myKey = Key<String, Int>("myKey")
myKey.key // "myKey"
myKey.keyType // `String`
myKey.valueType // `Int`
let userIDKey = StringKey<Int>("userID")
NSUserDefaults.standardUserDefaults().setObject(10, forKey: userIDKey)
NSUserDefaults.standardUserDefaults().objectForKey(userIDKey) // statically typed `Int?`
let userCellIdentifier = StringKey<UserCell><("userCell")
tableView.dequeueCell(userCellIdentifier) // statically typed `UserCell?`
let photoCellIdentifier = StringKey<PhotoCell><("photoCell")
collection.dequeueCell(photoCellIdentifier, forIndexPath: ...) // statically typed `PhotoCell?`
Anything Else?

Pull requests are welcomed 💖

Advanced Usage

Creating Custom Typed Key

To create your custom typed key, you should implement TypedKey protocol. For example, this is how StringKey is implemented:

public struct StringKey<Value>: TypedKey {
    public typealias KeyType = String
    public typealias ValueType = Value

    public let key: KeyType
    public init(_ key: KeyType) {
        self.key = key

Creating Custom Interface

You can make static typing key-value interface with TypedKey. Functions should use generic with type constraint on TypedKey. A type of the value can be inferred from the generic by using ValueType.

func set<T: TypedKey>(key: T, value: T.ValueType) {
    // do something great

A protocol TypedKey has two type aliases: KeyType and ValueType. You can make generic constraints on it.

func set<T: TypedKey where T.KeyType == String, T.ValueType: AnyObject>(key: T, value: T.ValueType) {
    // do something great with String key and AnyObject value


  • For iOS 8+ projects with CocoaPods:

    pod 'TypedKey', '~> 0.1.0'
  • For iOS 8+ projects with Carthage:

    github "devxoul/TypedKey" ~> 0.1.0
  • For iOS 7 projects with CocoaSeeds:

    github 'devxoul/TypedKey', '0.1.0', :files => 'Sources/*.swift'
  • Using Swift Package Manager:

    import PackageDescription
    let package = Package(
        name: "MyAwesomeApp",
        dependencies: [
            .Package(url: "", "0.1.0"),


TypedKey is under MIT license. See the LICENSE file for more info.

Latest podspec

    "name": "TypedKey",
    "version": "0.1.0",
    "summary": "Statically-typed key for Swift.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "Suyeol Jeon": "[email protected]"
    "source": {
        "git": "",
        "tag": "0.1.0"
    "source_files": "Sources/*.swift",
    "requires_arc": true,
    "platforms": {
        "ios": "8.0",
        "osx": "10.9",
        "tvos": "9.0"

Pin It on Pinterest

Share This