Swift 3: Дата против NSDate?

В чем разница между классами NS и non NS? В частности, NSDate vs Date? Представляет ли NS некоторый тип оболочки вокруг функциональности ядра NS?

Ответ 1

Swift 3 представил новые типы значений наложения для существующих Типы типов классов, такие как Date для NSDate, Data для NSData и еще несколько. Полный список и сведения можно найти в

Некоторые из причин были

  • Предоставить правильную семантику значений,
  • let и var вместо изменяемых и неизменяемых вариантов,
  • более "Swifty" API.

Новые типы наложений должны обеспечивать все функциональные возможности, которые соответствующий тип Foundation имеет, но при необходимости вы всегда можно отбрасывать от одного типа к другому.

Когда существующие API-интерфейсы Foundation импортированные в Swift, типы автоматически соединяются.

В отношении Date и NSDate: Date - тип значения и может быть константой или переменной:

var date = Date()
date += 10.0 // Add 10 seconds

тогда как NSDate является ссылочным типом и неизменным. Также Date есть Comparable

let date1 = Date()
let date2 = Date()

if date1 < date2 { }

тогда как NSDate можно сравнить только с .compare().

Примечание. Для этих "типов наложения" тип значения (struct) такой как Date и его базовый аналог (класс), такой как NSDate являются разными типами, и оба могут использоваться из Swift. Его нельзя путать с

где префикс NS просто отключен для определенного Foundation классы, например. NSBundle переименовывается в Bundle для Swift 3.

Ответ 2

Классы NS являются классами Objective-C. Поскольку Objective-C - это старый язык программирования для приложений iOS или MacOS, Swift позволяет использовать эти классы в вашем коде. Таким образом, вы можете перенести приложения из Objective-C в Swift, если хотите.

Не-NS классы или структуры являются эквивалентами Swift классов или структур NS. Подробнее об этом выпуске здесь или здесь.

Но имейте в виду: поскольку Objective-C и Swift - это разные языки программирования, может случиться так, что классы NS и non-NS не будут полностью работать одинаково.

Ответ 3

Как и ответы, приведенные выше, в более поверхностном литературном смысле дизайна NS был префиксом, данным всем в дни NextStep, прежде чем Стив Джобс был вызван обратно в Apple, и поэтому он был естественной частью Objective-C синтаксис.

Ускоренная перемотка вперед к разработке Swift, им нужна была точка очевидной разницы, и, возможно, это был CL в качестве префикса (для Криса Лэттнера), но, очевидно, предпочел отсутствие какого-либо префикса

Ответ 4

Разница между классами NS и non NS заключается в том, что классы NS являются ссылочным, тогда как классы non NS - это тип значений. В быстром 3 Apple представила классы Foundation, такие как NSDate, и переименовала их в Date, но так как swift основан на типах значений, а не на ссылочном типе, поэтому Date является типом значений. Например:

let date = NSDate() //1
date.dateByAddingTimeInterval(1000) //2 

2. Допустимо, поскольку дата является постоянной, но изменчивость зависит от класса, а не переменной vs.

тогда

let date = Date() //3
date.dateByAddingTimeInterval(1000) //4

4. не допускается и не приведет к ошибке, так как let делает "date" константой с "let", поскольку date является типом Date(), который является типом значения.

Ответ 5

NSDate и Date - это не одно и то же. Классы NS (следующий шаг) в текущий момент используются только в Objective-C, поэтому в Objective-C для представления переменной даты NSDate.

Что касается специально Swift 3.0, то новая версия Swift Apple полностью устранила необходимость использования префикса NS для любого из типов. Итак, только в Swift три теперь мы используем Date вместо NSDate. чтобы ваш код выглядел более чистым.