2016-09-05 1 views
0

Le code ci-dessous fait partie d'une extension de date. Cependant, dans Swift 3, je reçois quelques erreurs qui ne disparaîtront pas. Je l'ai déjà changé "NSCalendar" à "Calendrier":Extensions de date dans Swift 3

func startOfWeek(_ weekday: Int?) -> Date? { 
    guard 
     let cal = Calendar.current, 
     let comp: DateComponents = (cal as Calendar).components([.yearForWeekOfYear, .weekOfYear], from: self) else { return nil } 
    comp.to12pm() 
    cal.firstWeekday = weekday ?? 1 
    return cal.date(from: comp)! 
} 
func endOfWeek(_ weekday: Int) -> Date? { 
    guard 
     let cal = Calendar.current, 
     var comp: DateComponents = (cal as Calendar).components([.weekOfYear], from: self) else { return nil } 
    comp.weekOfYear = 1 
    comp.day -= 1 
    comp.to12pm() 
    return (cal as NSCalendar).date(byAdding: comp, to: self.startOfWeek(weekday)!, options: [])! 
} 

Lignes 3 & 11: laisser cal = Calendar.current, Initializer pour la liaison conditionnelle doit avoir un type en option, non 'Calendrier'

ligne 12: J'ai eu une erreur, mais fixe en changeant "laisser comp:" à "var comp:"

ligne 14: comp.day - = 1 Erreur: L'opérateur binaire '- =' ne peut pas être appliqué aux opérandes de type 'Int?' et 'Int'

Je ne suis pas génial avec les extensions, ce code a été adapté à partir d'une extension que j'ai trouvé en ligne, alors maintenant la mise à jour se révèle difficile. Aucune suggestion?

Dépannage (choses que j'ai essayé):

cal = Calendrier laissent .current,

Erreur: '?' Calendrier Type n'a pas de membre 'current'

let cal: Calendrier? = Calendar.current,

Erreur: Type explicitement spécifié 'Calendrier?' ajoute un niveau supplémentaire de facultatif à la initialiseur, ce qui rend le contrôle en option toujours réussir

laisser cal = Calendar.current ?,

Erreur: Impossible d'utiliser en option sur Enchaînement valeur non optionnelle de type « Calendrier »

+0

Vous devriez suivre ce que le tout compilateur vous dit. Certains types étaient optionnels, maintenant ils ne le sont pas: supprimez vos liaisons optionnelles. Il vous dit que la structure devrait être modifiable: faites-le ensuite voir comment cela fonctionne maintenant. Etc. – Moritz

+0

@EricAya J'ai essayé un let cal: 'Calendrier? = Calendar.current 'ainsi que' let cal = Calendar? .current 'et' let cal = Calendar.current? ' mais aucun n'a fonctionné. Alors, comment est-ce que je rends le calendrier facultatif? –

+0

juste une conjecture, comp.day - = 1' comp.day n'est pas une lvalue, c'est juste le retour d'une méthode appelée day on comp ... dans l'objectif-C il y a un peu de magie pour que les propriétés fonctionnent façon (c.-à-d. qu'il est différent d'un accesseur de point d'un objet obj c classique), peut-être que la magie est désactivée dans swift 3 –

Répondre

0

Mes extensions de date à Swift 3, sur la base des commentaires de @LeoDabus

func startOfWeek(_ weekday: Int? = 1) -> Date? { 
    var cal = Calendar.current 
    cal.firstWeekday = weekday ?? 1 
    let comp = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self) 
    comp.to12pm() 
    return cal.date(from: comp) 
} 
func endOfWeek(_ weekday: Int) -> Date? { 
    let cal = Calendar.current 
    var comp = cal.dateComponents([.weekOfYear], from: self) 
    comp.weekOfYear = 1 
    comp.day? -= 1 
    comp.to12pm() 
    return cal.date(byAdding: comp, to: self.startOfWeek(weekday)!)! 
} 

note Je suis encore à mi-migration, donc je ne peux que confirmer que ceux-ci éliminent les erreurs et ne peuvent pas les tester encore en production.

0

Vous pouvez obtenir tous les composants de la date séparément en utilisant cette extension:

extension Date { 

// MARK:- APP SPECIFIC FORMATS 

func app_dateFromString(strDate:String, format:String) -> Date? { 

    let dateFormatter:DateFormatter = DateFormatter() 
    dateFormatter.dateFormat = format 
    if let dtDate = dateFormatter.date(from: strDate){ 
     return dtDate as Date? 
    } 
    return nil 
} 


func app_stringFromDate() -> String{ 
    let dateFormatter:DateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
    let strdt = dateFormatter.string(from: self as Date) 
    if let dtDate = dateFormatter.date(from: strdt){ 
     return dateFormatter.string(from: dtDate) 
    } 
    return "--" 
} 

func app_stringFromDate_timeStamp() -> String{ 
    return "\(self.hourTwoDigit):\(self.minuteTwoDigit) \(self.AM_PM) \(self.monthNameShort) \(self.dayTwoDigit)" 
} 


func getUTCFormateDate(localDate: NSDate) -> String { 

    let dateFormatter:DateFormatter = DateFormatter() 
    let timeZone: NSTimeZone = NSTimeZone(name: "UTC")! 
    dateFormatter.timeZone = timeZone as TimeZone! 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm" 
    let dateString: String = dateFormatter.string(from: localDate as Date) 
    return dateString 
} 


func combineDateWithTime(date: NSDate, time: NSDate) -> NSDate? { 
    let calendar = NSCalendar.current 


    let dateComponents = calendar.dateComponents([.year, .month, .day], from: date as Date) 

    let timeComponents = calendar.dateComponents([.hour, .minute, .second], from: time as Date) 


    let mergedComponments = NSDateComponents() 
    mergedComponments.year = dateComponents.year! 
    mergedComponments.month = dateComponents.month! 
    mergedComponments.day = dateComponents.day! 
    mergedComponments.hour = timeComponents.hour! 
    mergedComponments.minute = timeComponents.minute! 
    mergedComponments.second = timeComponents.second! 

    return calendar.date(from: mergedComponments as DateComponents) as NSDate? 
} 

func getDatesBetweenDates(startDate:NSDate, andEndDate endDate:NSDate) -> [NSDate] { 
    let gregorian: NSCalendar = NSCalendar.current as NSCalendar; 
    let components = gregorian.components(NSCalendar.Unit.day, from: startDate as Date, to: endDate as Date, options: []) 
    var arrDates = [NSDate]() 
    for i in 0...components.day!{ 
     arrDates.append(startDate.addingTimeInterval(60*60*24*Double(i))) 
    } 
    return arrDates 
} 


func isGreaterThanDate(dateToCompare: NSDate) -> Bool { 
    //Declare Variables 
    var isGreater = false 

    //Compare Values 
    if self.compare(dateToCompare as Date) == ComparisonResult.orderedDescending { 
     isGreater = true 
    } 

    //Return Result 
    return isGreater 
} 

func isLessThanDate(dateToCompare: Date) -> Bool { 
    //Declare Variables 
    var isLess = false 

    //Compare Values 
    if self.compare(dateToCompare as Date) == ComparisonResult.orderedAscending { 
     isLess = true 
    } 

    //Return Result 
    return isLess 
} 

func equalToDate(dateToCompare: NSDate) -> Bool { 
    //Declare Variables 
    var isEqualTo = false 

    //Compare Values 
    if self.compare(dateToCompare as Date) == ComparisonResult.orderedSame { 
     isEqualTo = true 
    } 

    //Return Result 
    return isEqualTo 
} 


// MARK:- TIME 
var timeWithAMPM: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mma" 
    dateFormatter.amSymbol = "am" 
    dateFormatter.pmSymbol = "pm" 
    return dateFormatter.string(from: self as Date) 
} 




// MARK:- YEAR 


var yearFourDigit_Int: Int { 
    return Int(self.yearFourDigit)! 
} 

var yearOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "y" 
    return dateFormatter.string(from: self as Date) 
} 
var yearTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yy" 
    return dateFormatter.string(from: self as Date) 
} 
var yearFourDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy" 
    return dateFormatter.string(from: self as Date) 
} 



// MARK:- MONTH 

var monthOneDigit_Int: Int { 
    return Int(self.monthOneDigit)! 
} 
var monthTwoDigit_Int: Int { 
    return Int(self.monthTwoDigit)! 
} 


var monthOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "M" 
    return dateFormatter.string(from: self as Date) 
} 
var monthTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MM" 
    return dateFormatter.string(from: self as Date) 
} 
var monthNameShort: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMM" 
    return dateFormatter.string(from: self as Date) 
} 
var monthNameFull: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMMM" 
    return dateFormatter.string(from: self as Date) 
} 
var monthNameFirstLetter: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMMMM" 
    return dateFormatter.string(from: self as Date) 
} 

// MARK:- DAY 

var dayOneDigit_Int: Int { 
    return Int(self.dayOneDigit)! 
} 
var dayTwoDigit_Int: Int { 
    return Int(self.dayTwoDigit)! 
} 

var dayOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "d" 
    return dateFormatter.string(from: self as Date) 
} 
var dayTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "dd" 
    return dateFormatter.string(from: self as Date) 
} 
var dayNameShort: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "E" 
    return dateFormatter.string(from: self as Date) 
} 
var dayNameFull: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "EEEE" 
    return dateFormatter.string(from: self as Date) 
} 
var dayNameFirstLetter: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "EEEEE" 
    return dateFormatter.string(from: self as Date) 
} 




// MARK:- AM PM 
var AM_PM: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "a" 
    return dateFormatter.string(from: self as Date) 
} 

// MARK:- HOUR 


var hourOneDigit_Int: Int { 
    return Int(self.hourOneDigit)! 
} 
var hourTwoDigit_Int: Int { 
    return Int(self.hourTwoDigit)! 
} 
var hourOneDigit24Hours_Int: Int { 
    return Int(self.hourOneDigit24Hours)! 
} 
var hourTwoDigit24Hours_Int: Int { 
    return Int(self.hourTwoDigit24Hours)! 
} 
var hourOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h" 
    return dateFormatter.string(from: self as Date) 
} 
var hourTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "hh" 
    return dateFormatter.string(from: self as Date) 
} 
var hourOneDigit24Hours: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "H" 
    return dateFormatter.string(from: self as Date) 
} 
var hourTwoDigit24Hours: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "HH" 
    return dateFormatter.string(from: self as Date) 
} 

// MARK:- MINUTE 

var minuteOneDigit_Int: Int { 
    return Int(self.minuteOneDigit)! 
} 
var minuteTwoDigit_Int: Int { 
    return Int(self.minuteTwoDigit)! 
} 

var minuteOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "m" 
    return dateFormatter.string(from: self as Date) 
} 
var minuteTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "mm" 
    return dateFormatter.string(from: self as Date) 
} 


// MARK:- SECOND 

var secondOneDigit_Int: Int { 
    return Int(self.secondOneDigit)! 
} 
var secondTwoDigit_Int: Int { 
    return Int(self.secondTwoDigit)! 
} 

var secondOneDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "s" 
    return dateFormatter.string(from: self as Date) 
} 
var secondTwoDigit: String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "ss" 
    return dateFormatter.string(from: self as Date) 
} 

}