Update: From the Swift 2.2 Change Log (released March 21, 2016):
Designated class initializers declared as failable or throwing may now return nil or throw an error, respectively, before the object has been fully initialized.
For Swift 2.1 and earlier:
According to Apple's documentation (and your compiler error), a class must initialize all its stored properties before returning nil from a failable initializer:
For classes, however, a failable initializer can trigger an
  initialization failure only after all stored properties introduced by
  that class have been set to an initial value and any initializer
  delegation has taken place.
Note: It actually works fine for structures and enumerations, just not classes.
The suggested way to handle stored properties that can't be initialized before the initializer fails is to declare them as implicitly unwrapped optionals.
Example from the docs:
class Product {
    let name: String!
    init?(name: String) {
        if name.isEmpty { return nil }
        self.name = name
    }
}
In the example above, the name property of the Product class is
  defined as having an implicitly unwrapped optional string type
  (String!). Because it is of an optional type, this means that the name
  property has a default value of nil before it is assigned a specific
  value during initialization. This default value of nil in turn means
  that all of the properties introduced by the Product class have a
  valid initial value. As a result, the failable initializer for Product
  can trigger an initialization failure at the start of the initializer
  if it is passed an empty string, before assigning a specific value to
  the name property within the initializer.
In your case, however, simply defining userName as a String! does not fix the compile error because you still need to worry about initializing the properties on your base class, NSObject. Luckily, with userName defined as a String!, you can actually call super.init() before you return nil which will init your NSObject base class and fix the compile error.
class User: NSObject {
    let userName: String!
    let isSuperUser: Bool = false
    let someDetails: [String]?
    init?(dictionary: NSDictionary) {
        super.init()
        if let value = dictionary["user_name"] as? String {
            self.userName = value
        }
        else {
            return nil
        }
        if let value: Bool = dictionary["super_user"] as? Bool {
            self.isSuperUser = value
        }
        self.someDetails = dictionary["some_details"] as? Array
    }
}