Search code examples
iosswiftswift2nsdatemethod-swizzling

How to override NSDate description? ..Method Swizzling?


How can I call

print(NSDate()) 

and instead of receiving the usual response, obtain the one I have in a function named getString() that is part of an extension of NSDate.

Here's my extension:

extension NSDate {
    
   //NSDate to String
    public func getString() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
        dateFormatter.locale = NSLocale.currentLocale()
        
        return dateFormatter.stringFromDate(self)
    }
}

Please, note that I don't want to just use:

NSDate().getString()

I want to override original description of this class.

UPDATE:

So, everything looks like the only option is Method Swizzling, if even possible.

Anyone interested in the bounty?

HEADS UP

I'm doing this just for personal growth and to get to understand the concept, not planning on shipping an App using it in this scenario, not even sure right now in what scenarios I could be using it.


Solution

  • import Foundation
    
    extension NSDate: Streamable {
        public func writeTo<Target : OutputStreamType>(inout target: Target) {
            let dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
            dateFormatter.locale = NSLocale.currentLocale()
    
            print("without swizzling", dateFormatter.stringFromDate(self), toStream: &target)
        }
    }
    
    let date = NSDate()
    
    print(date) // without swizzling 2016-03-05 00:09:34 +0100
    

    to print 'default' / original behavior / use

    print(date.description)
    

    if you are worry about using print in your extension just replace it with

    //print("without swizzling", dateFormatter.stringFromDate(self), toStream: &target)
    let str = dateFormatter.stringFromDate(self)
    str.writeTo(&target)