Typed NSUserDefaults
Our constructors would be better as failable initializers.  

Nothing prevents us from passing a wrapped NSNumber to the String initializer, or a wrapped String to the Int initializer.  In your code, this would simply crash.  It would be better if our initializers were allowed to fail.

First, we need to change the protocol to define a failable initializer rather than a non-failable initializer:

public protocol UserDefaultsValue {
    var userDefault: UserDefaultsObject { get }
    init?(UserDefaultsObject)
}


Now, write the initializers as failable:

extension Int: UserDefaultsValue {
    public var userDefault: UserDefaultsObject {
        return NSNumber(integer: self)
    }
    public init?(_ object: UserDefaultsObject) {
        if let number = object as? NSNumber {
            self = number.integerValue
        } else {
            return nil
        }
    }
}




We can clean up our UserDefault constructor a bit as well.


if let object: AnyObject = NSUserDefaults.standardUserDefaults().objectForKey(key) {
    let userDefaultsObject = object as! UserDefaultsObject // this is the crucial line
    store = T(userDefaultsObject)
}



Like our initializers which should be failable, this runs the risk of crashing if object turns out to be some type which isn't a UserDefaultsObject.  We can clean this up slightly though.  This can look cleaner and be safer:

if let object = NSUserDefaults.standardUserDefaults().objectForKey(key) as? UserDefaultsObject {
    store = T(object)
}


The conditional will fail if:


There isn't already an object for this key.
Whatever NSUserDefaults returns for this key cannot be interpreted as a UserDefaultsObject.


There is one major concern I have, however, and I don't know of the right solution right now.

Consider the following situation, I save an NSNumber object to the key "abckey".  Now, I do this:

let s = UserDefault(key: "abckey", defaultValue: "Hello World")


In your version of the code, this will happen will crash because this line:

let userDefaultsObject = object as! UserDefaultObject


Will have no problem converting an NSNumber to a UserDefaultObject (assuming you fixed it with extension NSNumber: UserDefaultsObject {}), but the following line will be problematic:

store = T(userDefaultsObject)


Because the type of T will be a String (we passed a String for defaultValue argument).

Our extension String: UserDefaultsValue will have to include several constructors which take every sort of possible thing that can be stored in NSUserDefaults.  And some of those simply won't make sense.