2016-09-05 4 views
0

Данный код является частью расширения даты. Однако в Swift 3 я получаю несколько ошибок, которые не исчезнут. Я уже изменил "NSCalendar" на "календарь":Расширения даты в 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: [])! 
} 

Линии 3 & 11: пусть кал = Calendar.current, Initializer для условной привязки должны иметь факультативный тип, а не 'Календарь'

линия 12: у меня была ошибка, но фиксировано, изменив "пусть комп:" в "уаг комп:"

линия 14: comp.day - = 1 Ошибка: двоичный оператор '- =' не может применяться к операндам типа 'Int?' и 'Int'

Я не очень хорош с расширениями, этот код был адаптирован из расширения, которое я нашел в Интернете, поэтому обновление теперь оказывается трудным. Какие-либо предложения?

Устранение неполадок (вещи, которые я пробовал):

пусть кал = Календарь .current,

Ошибка:? '?' Calendar Type не имеет текущего статуса '

let cal: Календарь? = Calendar.current,

Ошибка: явно определенный тип 'Calendar?' добавляет дополнительный уровень необязательного инициализатора, делая дополнительную проверку всегда удается

пусть кал = Calendar.current ?,

Ошибка: Не удаешься использовать опциональные цепочки на неопциональном значении типа «Календарь»

+0

Вы должны просто следовать тому, что компилятор говорит вам. Некоторые типы были опциями, теперь они не являются: удалите необязательные привязки. В нем говорится, что структура должна быть изменчивой: тогда она увидит, как она работает. И т. Д. – Moritz

+0

@EricAya Я попробовал let cal: «Календарь? = Calendar.current ', а также' let cal = Calendar? .current 'и' let cal = Calendar.current? ' но никто не работал. Итак, как мне сделать календарь необязательным? –

+0

просто угадать, 'comp.day - = 1' comp.day не lvalue, это просто возврат из метода, называемого day on comp ... в объективе-C есть некоторая магия, чтобы заставить свойства работать (то есть он отличается от точечного аксессора классического объекта obj c), возможно, что магия отключена в swift 3 –

ответ

0

Мои даты расширения в Swift 3, на основе замечаний, полученных от @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)!)! 
} 

Примечание Я еще в середине миграции, так что я могу только подтвердить, что они устраняют ошибки и не может проверить их в производстве еще.

0

Вы можете получить каждый компонент даты отдельно, используя это расширение:

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) 
} 

}

Смежные вопросы