Как преобразовать .hour () и .minute () из Swift в Objective-C?

Как преобразовать .minute () и .hour () в Objective-C?

func nearestHour () -> Int {
    let halfHour = NSDate.minuteInSeconds() * 30
    var interval = self.timeIntervalSinceReferenceDate
    if  self.seconds() < 30 {
        interval -= halfHour
    } else {
        interval += halfHour
    }
    let date = NSDate(timeIntervalSinceReferenceDate: interval)
    return date.hour()
}

Я пробовал это:

- (int) nearestHour {
NSInteger halfHour = [NSDate minuteInSeconds].intValue * 30;
NSTimeInterval interval = [self timeIntervalSinceReferenceDate];
if ([self seconds] < 30) {
    interval -= halfHour;
}
else {
    interval += halfHour;
}
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate: interval];
return [date hour];
}

Я получаю следующие ошибки в этих строках:

if ([self seconds] < 30) {

no visible @interface для NSDate объявляет секунды селектора.

return [date hour];

no visible @interface для NSDate объявляет час селектора.


person Community    schedule 14.04.2016    source источник
comment
Посмотрите документацию для NSDate. Нет таких методов, как seconds или hour. Они должны быть настраиваемыми функциями в вашем коде Swift.   -  person rmaddy    schedule 14.04.2016
comment
Пожалуйста, обратитесь по этой ссылке, это показывает четкое изображение способ преобразования [См. также эту ссылку] [1] [1]: stackoverflow.com/questions/1739383/   -  person Sridhar G.K    schedule 14.04.2016
comment
Я уже видел эту ссылку. И я знаю, что в быстром коде нет специальной функции с именем hour () или seconds (), поэтому я был удивлен. И поэтому мне хотелось бы получить ответ на свой вопрос.   -  person    schedule 14.04.2016
comment
@ SridharG.K Это не имеет ничего общего с этим вопросом.   -  person rmaddy    schedule 14.04.2016
comment
@CodeOxO Нет minuteInSeconds метода на NSDate, но ваш код вызывает такой метод. Это также должен быть какой-то метод категорий.   -  person rmaddy    schedule 14.04.2016


Ответы (2)


Как уже упоминалось, NSDate не имеет необходимого интерфейса. Вам нужно разбить его на интерфейс календаря. Затем вы можете установить час / минуту / секунды и тому подобное по отдельности или получить их или что-то еще, что вам нужно сделать.

NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:self];

if ([components seconds] < 30) {

Для вашего примера:

- (int) nearestHour {
    NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:self];
    NSInteger halfHour = [NSDate minuteInSeconds].intValue * 30;
    NSTimeInterval interval = [self timeIntervalSinceReferenceDate];
    if ([components minutes] < 30) {
        interval -= halfHour;
    }
    else {
        interval += halfHour;
    }
    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:    interval];
    return [date hour];
}

Множество примеров по SO и google: Как получить текущий час использования Какао?

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/DatesAndTimes.html#//apple%5Fref/doc/uid/10000039.

person LawfulEvil    schedule 14.04.2016
comment
Объяснение, почему новую версию (swift) проще использовать, чем старую версию (xcode / objective c)? Они улучшили ситуацию. - person LawfulEvil; 14.04.2016

Apple рекомендует всегда выполнять математические вычисления даты с NSCalendar, потому что, например, при переходе на летнее время некоторые даты, вычисленные путем добавления / вычитания секунд, могут не существовать.

nextDateAfterDate вычисляет следующую дату в зависимости от указанных компонентов даты, в данном случае это следующая дата, когда минуты равны нулю. Чтобы получить ближайший час в прошлом, вы также можете выполнить поиск в обратном направлении.

Swift

let now = NSDate()
let calendar = NSCalendar.currentCalendar()
let roundDown = calendar.component(.Minute, fromDate: now) < 30
let components = NSDateComponents()
components.minute = 0
let options : NSCalendarOptions = roundDown ? [.MatchNextTime, .SearchBackwards] : .MatchNextTime
let nearestDate = calendar.nextDateAfterDate(now, matchingComponents: components, options:  options)!
let nearestHour = calendar.component(.Hour, fromDate: nearestDate)

Цель-C

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
BOOL roundDown = [calendar component:NSCalendarUnitMinute fromDate: now] < 30 ;
NSDateComponents *components = [[NSDateComponents alloc] init];
components.minute = 0;
NSCalendarOptions options = roundDown ? (NSCalendarMatchNextTime | NSCalendarSearchBackwards) : NSCalendarMatchNextTime;
NSDate *nearestDate = [calendar nextDateAfterDate:now matchingComponents: components options:  options];
NSInteger nearestHour = [calendar component:NSCalendarUnitHour fromDate: nearestDate];
person vadian    schedule 14.04.2016