From 2223a639ee7bd889e5531aa54cbc611620592e59 Mon Sep 17 00:00:00 2001 From: Melvin Rivera Date: Thu, 16 Jul 2015 18:21:35 -0400 Subject: [PATCH] Improved perf by reusing NSDateFormatters. Added documentation. --- AFDateHelper.podspec | 2 +- AFDateHelper/AFDateExtension.swift | 455 +++++++++++++++++++++++++---- Demo.xcodeproj/project.pbxproj | 4 +- 3 files changed, 400 insertions(+), 61 deletions(-) diff --git a/AFDateHelper.podspec b/AFDateHelper.podspec index d31ef3c..cf69d47 100644 --- a/AFDateHelper.podspec +++ b/AFDateHelper.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.name = "AFDateHelper" - s.version = "2.0.3" + s.version = "2.0.4" s.summary = "Extension for NSDate in Swift." s.description = <<-DESC Extension for NSDate in Swift for creating, modifying or comparing dates. diff --git a/AFDateHelper/AFDateExtension.swift b/AFDateHelper/AFDateExtension.swift index 5473cf3..15897ce 100644 --- a/AFDateHelper/AFDateExtension.swift +++ b/AFDateHelper/AFDateExtension.swift @@ -1,7 +1,7 @@ // // AFDateExtension.swift // -// Version 2.0.3 +// Version 2.0.4 // // Created by Melvin Rivera on 7/15/14. // Copyright (c) 2014. All rights reserved. @@ -9,6 +9,11 @@ import Foundation +let DefaultFormat = "EEE MMM dd HH:mm:ss Z yyyy" +let ISO8601Format = "yyyy-MM-dd'T'HH:mm:ssZZZ" +let RSSFormat = "EEE, d MMM yyyy HH:mm:ss ZZZ" +let AltRSSFormat = "d MMM yyyy HH:mm:ss ZZZ" + public enum DateFormat { case ISO8601, DotNet, RSS, AltRSS case Custom(String) @@ -36,6 +41,13 @@ public extension NSDate { // MARK: Date From String + /** + Returns a new NSDate object based on a date string and a specified format. + + :param: fromString :String Date string i.e. "16 July 1972 6:12:00". + :param: format :DateFormat Format of date. Can be .ISO8601("1972-07-16T08:15:30-05:00"), DotNet("/Date(1268123281843)/"), RSS("Fri, 09 Sep 2011 15:26:08 +0200"), AltRSS("09 Sep 2011 15:26:08 +0200") or Custom("16 July 1972 6:12:00"). + :returns: NSDate + */ convenience init(fromString string: String, format:DateFormat) { if string.isEmpty { @@ -49,7 +61,6 @@ public extension NSDate { case .DotNet: - // Expects "/Date(1268123281843)/" let startIndex = string.rangeOfString("(").location + 1 let endIndex = string.rangeOfString(")").location let range = NSRange(location: startIndex, length: endIndex-startIndex) @@ -65,16 +76,8 @@ public extension NSDate { } else if string.hasSuffix("Z") { s = s.substringToIndex(s.length-1) + "GMT" } - - struct Static { - static var formatter: NSDateFormatter? = nil - static var token: dispatch_once_t = 0; - } - dispatch_once(&Static.token) { - Static.formatter = NSDateFormatter(); - Static.formatter?.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZ" - } - if let date = Static.formatter!.dateFromString(string as String) { + var formatter = NSDate.formatter(format: ISO8601Format) + if let date = formatter.dateFromString(string as String) { self.init(timeInterval:0, sinceDate:date) } else { self.init() @@ -86,15 +89,8 @@ public extension NSDate { if string.hasSuffix("Z") { s = s.substringToIndex(s.length-1) + "GMT" } - struct Static { - static var formatter: NSDateFormatter? = nil - static var token: dispatch_once_t = 0; - } - dispatch_once(&Static.token) { - Static.formatter = NSDateFormatter(); - Static.formatter?.dateFormat = "EEE, d MMM yyyy HH:mm:ss ZZZ" - } - if let date = Static.formatter!.dateFromString(string as String) { + var formatter = NSDate.formatter(format: RSSFormat) + if let date = formatter.dateFromString(string as String) { self.init(timeInterval:0, sinceDate:date) } else { self.init() @@ -106,15 +102,8 @@ public extension NSDate { if string.hasSuffix("Z") { s = s.substringToIndex(s.length-1) + "GMT" } - struct Static { - static var formatter: NSDateFormatter? = nil - static var token: dispatch_once_t = 0; - } - dispatch_once(&Static.token) { - Static.formatter = NSDateFormatter(); - Static.formatter?.dateFormat = "d MMM yyyy HH:mm:ss ZZZ" - } - if let date = Static.formatter!.dateFromString(string as String) { + var formatter = NSDate.formatter(format: AltRSSFormat) + if let date = formatter.dateFromString(string as String) { self.init(timeInterval:0, sinceDate:date) } else { self.init() @@ -122,15 +111,8 @@ public extension NSDate { case .Custom(let dateFormat): - struct Static { - static var formatter: NSDateFormatter? = nil - static var token: dispatch_once_t = 0; - } - dispatch_once(&Static.token) { - Static.formatter = NSDateFormatter(); - Static.formatter?.dateFormat = dateFormat - } - if let date = Static.formatter!.dateFromString(string as String) { + var formatter = NSDate.formatter(format: dateFormat) + if let date = formatter.dateFromString(string as String) { self.init(timeInterval:0, sinceDate:date) } else { self.init() @@ -142,6 +124,12 @@ public extension NSDate { // MARK: Comparing Dates + /** + Compares dates without while ignoring time. + + :param: date :NSDate Date to compare. + :returns: :Bool Returns true if dates are equal. + */ func isEqualToDateIgnoringTime(date: NSDate) -> Bool { let comp1 = NSDate.components(fromDate: self) @@ -149,21 +137,42 @@ public extension NSDate { return ((comp1.year == comp2.year) && (comp1.month == comp2.month) && (comp1.day == comp2.day)) } + /** + Checks if date is today. + + :returns: :Bool Returns true if date is today. + */ func isToday() -> Bool { return self.isEqualToDateIgnoringTime(NSDate()) } + /** + Checks if date is tomorrow. + + :returns: :Bool Returns true if date is tomorrow. + */ func isTomorrow() -> Bool { return self.isEqualToDateIgnoringTime(NSDate().dateByAddingDays(1)) } + /** + Checks if date is yesterday. + + :returns: :Bool Returns true if date is yesterday. + */ func isYesterday() -> Bool { return self.isEqualToDateIgnoringTime(NSDate().dateBySubtractingDays(1)) } + /** + Compares dates to see if they are in the same week. + + :param: date :NSDate Date to compare. + :returns: :Bool Returns true if date is tomorrow. + */ func isSameWeekAsDate(date: NSDate) -> Bool { let comp1 = NSDate.components(fromDate: self) @@ -176,11 +185,21 @@ public extension NSDate { return abs(self.timeIntervalSinceDate(date)) < NSDate.weekInSeconds() } + /** + Checks if date is this week. + + :returns: :Bool Returns true if date is this week. + */ func isThisWeek() -> Bool { return self.isSameWeekAsDate(NSDate()) } + /** + Checks if date is next week. + + :returns: :Bool Returns true if date is next week. + */ func isNextWeek() -> Bool { let interval: NSTimeInterval = NSDate().timeIntervalSinceReferenceDate + NSDate.weekInSeconds() @@ -188,6 +207,11 @@ public extension NSDate { return self.isSameWeekAsDate(date) } + /** + Checks if date is last week. + + :returns: :Bool Returns true if date is last week. + */ func isLastWeek() -> Bool { let interval: NSTimeInterval = NSDate().timeIntervalSinceReferenceDate - NSDate.weekInSeconds() @@ -195,6 +219,12 @@ public extension NSDate { return self.isSameWeekAsDate(date) } + /** + Compares dates to see if they are in the same year. + + :param: date :NSDate Date to compare. + :returns: :Bool Returns true if date is this week. + */ func isSameYearAsDate(date: NSDate) -> Bool { let comp1 = NSDate.components(fromDate: self) @@ -202,11 +232,21 @@ public extension NSDate { return (comp1.year == comp2.year) } + /** + Checks if date is this year. + + :returns: :Bool Returns true if date is this year. + */ func isThisYear() -> Bool { return self.isSameYearAsDate(NSDate()) } + /** + Checks if date is next year. + + :returns: :Bool Returns true if date is next year. + */ func isNextYear() -> Bool { let comp1 = NSDate.components(fromDate: self) @@ -214,6 +254,11 @@ public extension NSDate { return (comp1.year == comp2.year + 1) } + /** + Checks if date is last year. + + :returns: :Bool Returns true if date is last year. + */ func isLastYear() -> Bool { let comp1 = NSDate.components(fromDate: self) @@ -221,11 +266,23 @@ public extension NSDate { return (comp1.year == comp2.year - 1) } + /** + Compares dates to see if it's an earlier date. + + :param: date :NSDate Date to compare. + :returns: :Bool Returns true if date is earlier. + */ func isEarlierThanDate(date: NSDate) -> Bool { return self.earlierDate(date) == self } + /** + Compares dates to see if it's a later date. + + :param: date :NSDate Date to compare. + :returns: :Bool Returns true if date is later. + */ func isLaterThanDate(date: NSDate) -> Bool { return self.laterDate(date) == self @@ -234,6 +291,12 @@ public extension NSDate { // MARK: Adjusting Dates + /** + Returns a new NSDate object by a adding days. + + :param: days :Int Days to add. + :returns: NSDate + */ func dateByAddingDays(days: Int) -> NSDate { let dateComp = NSDateComponents() @@ -241,6 +304,12 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object by a substracting days. + + :param: days :Int Days to substract. + :returns: NSDate + */ func dateBySubtractingDays(days: Int) -> NSDate { let dateComp = NSDateComponents() @@ -248,6 +317,12 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object by a adding hours. + + :param: days :Int Hours to add. + :returns: NSDate + */ func dateByAddingHours(hours: Int) -> NSDate { let dateComp = NSDateComponents() @@ -255,6 +330,12 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object by a substracting hours. + + :param: days :Int Hours to substract. + :returns: NSDate + */ func dateBySubtractingHours(hours: Int) -> NSDate { let dateComp = NSDateComponents() @@ -262,6 +343,12 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object by a adding minutes. + + :param: days :Int Minutes to add. + :returns: NSDate + */ func dateByAddingMinutes(minutes: Int) -> NSDate { let dateComp = NSDateComponents() @@ -269,6 +356,12 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object by a adding minutes. + + :param: days :Int Minutes to add. + :returns: NSDate + */ func dateBySubtractingMinutes(minutes: Int) -> NSDate { let dateComp = NSDateComponents() @@ -276,6 +369,11 @@ public extension NSDate { return NSCalendar.currentCalendar().dateByAddingComponents(dateComp, toDate: self, options: NSCalendarOptions(0))! } + /** + Returns a new NSDate object from the start of the day. + + :returns: NSDate + */ func dateAtStartOfDay() -> NSDate { var components = self.components() @@ -285,6 +383,11 @@ public extension NSDate { return NSCalendar.currentCalendar().dateFromComponents(components)! } + /** + Returns a new NSDate object from the end of the day. + + :returns: NSDate + */ func dateAtEndOfDay() -> NSDate { var components = self.components() @@ -294,6 +397,11 @@ public extension NSDate { return NSCalendar.currentCalendar().dateFromComponents(components)! } + /** + Returns a new NSDate object from the start of the week. + + :returns: NSDate + */ func dateAtStartOfWeek() -> NSDate { let flags :NSCalendarUnit = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitWeekOfYear | NSCalendarUnit.CalendarUnitWeekday @@ -305,6 +413,11 @@ public extension NSDate { return NSCalendar.currentCalendar().dateFromComponents(components)! } + /** + Returns a new NSDate object from the end of the week. + + :returns: NSDate + */ func dateAtEndOfWeek() -> NSDate { let flags :NSCalendarUnit = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitWeekOfYear | NSCalendarUnit.CalendarUnitWeekday @@ -319,36 +432,72 @@ public extension NSDate { // MARK: Retrieving Intervals + /** + Returns the interval in minutes after a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func minutesAfterDate(date: NSDate) -> Int { let interval = self.timeIntervalSinceDate(date) return Int(interval / NSDate.minuteInSeconds()) } + /** + Returns the interval in minutes before a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func minutesBeforeDate(date: NSDate) -> Int { let interval = date.timeIntervalSinceDate(self) return Int(interval / NSDate.minuteInSeconds()) } + /** + Returns the interval in hours after a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func hoursAfterDate(date: NSDate) -> Int { let interval = self.timeIntervalSinceDate(date) return Int(interval / NSDate.hourInSeconds()) } + /** + Returns the interval in hours before a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func hoursBeforeDate(date: NSDate) -> Int { let interval = date.timeIntervalSinceDate(self) return Int(interval / NSDate.hourInSeconds()) } + /** + Returns the interval in days after a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func daysAfterDate(date: NSDate) -> Int { let interval = self.timeIntervalSinceDate(date) return Int(interval / NSDate.dayInSeconds()) } + /** + Returns the interval in days before a date. + + :param: date :NSDate Date to compare. + :returns: Int + */ func daysBeforeDate(date: NSDate) -> Int { let interval = date.timeIntervalSinceDate(self) @@ -358,6 +507,11 @@ public extension NSDate { // MARK: Decomposing Dates + /** + Returns the nearest hour. + + :returns: Int + */ func nearestHour () -> Int { let halfHour = NSDate.minuteInSeconds() * 30 var interval = self.timeIntervalSinceReferenceDate @@ -370,31 +524,100 @@ public extension NSDate { return date.hour() } + /** + Returns the year component. + + :returns: Int + */ func year () -> Int { return self.components().year } + /** + Returns the month component. + + :returns: Int + */ func month () -> Int { return self.components().month } + /** + Returns the week of year component. + + :returns: Int + */ func week () -> Int { return self.components().weekOfYear } + /** + Returns the day component. + + :returns: Int + */ func day () -> Int { return self.components().day } + /** + Returns the hour component. + + :returns: Int + */ func hour () -> Int { return self.components().hour } + /** + Returns the minute component. + + :returns: Int + */ func minute () -> Int { return self.components().minute } + /** + Returns the seconds component. + + :returns: Int + */ func seconds () -> Int { return self.components().second } + /** + Returns the weekday component. + + :returns: Int + */ func weekday () -> Int { return self.components().weekday } - func nthWeekday () -> Int { return self.components().weekdayOrdinal } //// e.g. 2nd Tuesday of the month is 2 + /** + Returns the nth days component. e.g. 2nd Tuesday of the month is 2. + + :returns: Int + */ + func nthWeekday () -> Int { return self.components().weekdayOrdinal } + /** + Returns the days of the month. + + :returns: Int + */ func monthDays () -> Int { return NSCalendar.currentCalendar().rangeOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitMonth, forDate: self).length } - + /** + Returns the first day of the week. + + :returns: Int + */ func firstDayOfWeek () -> Int { let distanceToStartOfWeek = NSDate.dayInSeconds() * Double(self.components().weekday - 1) let interval: NSTimeInterval = self.timeIntervalSinceReferenceDate - distanceToStartOfWeek return NSDate(timeIntervalSinceReferenceDate: interval).day() } + /** + Returns the last day of the week. + + :returns: Int + */ func lastDayOfWeek () -> Int { let distanceToStartOfWeek = NSDate.dayInSeconds() * Double(self.components().weekday - 1) let distanceToEndOfWeek = NSDate.dayInSeconds() * Double(7) let interval: NSTimeInterval = self.timeIntervalSinceReferenceDate - distanceToStartOfWeek + distanceToEndOfWeek return NSDate(timeIntervalSinceReferenceDate: interval).day() } + /** + Checks to see if the date is a weekdday. + + :returns: :Bool Returns true if weekday. + */ func isWeekday() -> Bool { return !self.isWeekend() } + /** + Checks to see if the date is a weekdend. + + :returns: :Bool Returns true if weekend. + */ func isWeekend() -> Bool { let range = NSCalendar.currentCalendar().maximumRangeOfUnit(NSCalendarUnit.CalendarUnitWeekday) return (self.weekday() == range.location || self.weekday() == range.length) @@ -403,10 +626,21 @@ public extension NSDate { // MARK: To String + /** + Returns a new String object using .ShortStyle date style and .ShortStyle time style. + + :returns: :String + */ func toString() -> String { return self.toString(dateStyle: .ShortStyle, timeStyle: .ShortStyle, doesRelativeDateFormatting: false) } + /** + Returns a new String object based on a specified date format. + + :param: format :DateFormat Format of date. Can be .ISO8601("1972-07-16T08:15:30-05:00"), DotNet("/Date(1268123281843)/"), RSS("Fri, 09 Sep 2011 15:26:08 +0200"), AltRSS("09 Sep 2011 15:26:08 +0200") or Custom("16 July 1972 6:12:00"). + :returns: String + */ func toString(#format: DateFormat) -> String { var dateFormat: String @@ -416,28 +650,37 @@ public extension NSDate { let nowMillis = 1000 * self.timeIntervalSince1970 return "/Date(\(nowMillis)\(offset))/" case .ISO8601: - dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" + dateFormat = ISO8601Format case .RSS: - dateFormat = "EEE, d MMM yyyy HH:mm:ss ZZZ" + dateFormat = RSSFormat case .AltRSS: - dateFormat = "d MMM yyyy HH:mm:ss ZZZ" + dateFormat = AltRSSFormat case .Custom(let string): dateFormat = string } - let formatter = NSDateFormatter() - formatter.dateFormat = dateFormat + var formatter = NSDate.formatter(format: dateFormat) return formatter.stringFromDate(self) } + /** + Returns a new String object based on a date style, time style and optional relative flag. + + :param: dateStyle :NSDateFormatterStyle + :param: timeStyle :NSDateFormatterStyle + :param: doesRelativeDateFormatting :Bool + :returns: String + */ func toString(#dateStyle: NSDateFormatterStyle, timeStyle: NSDateFormatterStyle, doesRelativeDateFormatting: Bool = false) -> String { - let formatter = NSDateFormatter() - formatter.dateStyle = dateStyle - formatter.timeStyle = timeStyle - formatter.doesRelativeDateFormatting = doesRelativeDateFormatting + var formatter = NSDate.formatter(dateStyle: dateStyle, timeStyle: timeStyle, doesRelativeDateFormatting: doesRelativeDateFormatting) return formatter.stringFromDate(self) } + /** + Returns a new String object based on a relative time language. i.e. just now, 1 minute ago etc.. + + :returns: String + */ func relativeTimeToString() -> String { let time = self.timeIntervalSince1970 @@ -485,37 +728,133 @@ public extension NSDate { return self.toString() } - + /** + Returns the weekday as a new String object. + + :returns: String + */ func weekdayToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.weekdaySymbols[self.weekday()-1] as! String } + /** + Returns the short weekday as a new String object. + + :returns: String + */ func shortWeekdayToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.shortWeekdaySymbols[self.weekday()-1] as! String } + /** + Returns the very short weekday as a new String object. + + :returns: String + */ func veryShortWeekdayToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.veryShortWeekdaySymbols[self.weekday()-1] as! String } + /** + Returns the month as a new String object. + + :returns: String + */ func monthToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.monthSymbols[self.month()-1] as! String } + /** + Returns the short month as a new String object. + + :returns: String + */ func shortMonthToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.shortMonthSymbols[self.month()-1] as! String } + /** + Returns the very short month as a new String object. + + :returns: String + */ func veryShortMonthToString() -> String { - let formatter = NSDateFormatter() + var formatter = NSDate.formatter() return formatter.veryShortMonthSymbols[self.month()-1] as! String } - + // MARK: Static Cached Formatters + + /** + Returns a static singleton array of NSDateFormatters so that thy are only created once. + + :returns: [String: NSDateFormatter] Array of NSDateFormatters + */ + private class func sharedDateFormatters() -> [String: NSDateFormatter] { + struct Static { + static var formatters: [String: NSDateFormatter]? = nil + static var once: dispatch_once_t = 0 + } + dispatch_once(&Static.once) { + Static.formatters = [String: NSDateFormatter]() + } + return Static.formatters! + } + + /** + Returns a singleton formatter based on the format, timeZone and locale. Formatters are cached in a singleton array using hashkeys generated by format, timeZone and locale. + + :param: format :String + :param: timeZone :NSTimeZone Uses local time zone as the default + :param: locale :NSLocale Uses current locale as the default + :returns: [String: NSDateFormatter] Singleton of NSDateFormatters + */ + private class func formatter(format:String = DefaultFormat, timeZone: NSTimeZone = NSTimeZone.localTimeZone(), locale: NSLocale = NSLocale.currentLocale()) -> NSDateFormatter { + let hashKey = "\(format.hashValue)\(timeZone.hashValue)\(locale.hashValue)" + var formatters = NSDate.sharedDateFormatters() + if let cachedDateFormatter = formatters[hashKey] { + return cachedDateFormatter + } else { + let formatter = NSDateFormatter() + formatter.dateFormat = format + formatter.timeZone = timeZone + formatter.locale = locale + formatters[hashKey] = formatter + return formatter + } + } + + /** + Returns a singleton formatter based on date style, time style and relative date. Formatters are cached in a singleton array using hashkeys generated by date style, time style, relative date, timeZone and locale. + + :param: dateStyle :NSDateFormatterStyle + :param: timeStyle :NSDateFormatterStyle + :param: doesRelativeDateFormatting :Bool + :param: timeZone :NSTimeZone + :param: locale :NSLocale + :returns: [String: NSDateFormatter] Singleton array of NSDateFormatters + */ + private class func formatter(#dateStyle: NSDateFormatterStyle, timeStyle: NSDateFormatterStyle, doesRelativeDateFormatting: Bool, timeZone: NSTimeZone = NSTimeZone.localTimeZone(), locale: NSLocale = NSLocale.currentLocale()) -> NSDateFormatter { + var formatters = NSDate.sharedDateFormatters() + let hashKey = "\(dateStyle.hashValue)\(timeStyle.hashValue)\(doesRelativeDateFormatting.hashValue)\(timeZone.hashValue)\(locale.hashValue)" + if let cachedDateFormatter = formatters[hashKey] { + return cachedDateFormatter + } else { + let formatter = NSDateFormatter() + formatter.dateStyle = dateStyle + formatter.timeStyle = timeStyle + formatter.doesRelativeDateFormatting = doesRelativeDateFormatting + formatter.timeZone = timeZone + formatter.locale = locale + formatters[hashKey] = formatter + return formatter + } + } + } diff --git a/Demo.xcodeproj/project.pbxproj b/Demo.xcodeproj/project.pbxproj index 5552e3e..f1207b7 100644 --- a/Demo.xcodeproj/project.pbxproj +++ b/Demo.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -121,7 +121,7 @@ }; }; buildConfigurationList = 655AEB3A192D42990053AD6C /* Build configuration list for PBXProject "Demo" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = (