Если +initialize / + загрузка всегда запускаются с: если (сам == [класс MyClass]) защита?

Вы можете создать объект JavaScript Date, передав значения year, month, day. Обратите внимание, что вам нужно -1 из месяца, потому что месяцы, как и большинство вещей в JavaScript, начинаются с 0. (January = 0, December = 11)

Когда у вас есть дата, вы можете использовать Date.toLocaleString(), что позволяет вам передавать объект options с вашими предпочтениями форматирования.

$("#btnGetDate").on("click", function() {
  //Get values from the inputs
  var year = $("#txtYear").val();
  var month = $("#ddlMonth").val();
  var day = $("#txtDay").val();

  //Format the date and output it
  var formattedDate = formatDate(year, month, day);
  console.log(`Your date is ${formattedDate}`);
});

function formatDate(year, month, day) {
  //Create a Date object using the values
  var date = new Date(year, month - 1, day);

  //Define how you want the date to be formatted
  var options = {
    weekday: "long",
    year: "numeric",
    month: "long",
    day: "numeric"
  };

  //Format the date according to our options
  return date.toLocaleDateString("en-US", options);
}
input,select {margin-right: 10px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Month
<select id="ddlMonth">
  <option value="01">January</option>
  <option value="02">February</option>
  <option value="03">March</option>
  <!-- and so on... -->
</select>

Day
<input id="txtDay" type="number" placeholder="dd">

Year
<input id="txtYear" type="number" placeholder="yyyy">

<button id="btnGetDate">Output Date</button>

Конечно, это может использовать некоторые ограждения / проверки правильности ввода неправильных дат, ввода дня или года в неправильном формате и т. д., но я оставлю эту часть на ваше усмотрение!

10
задан Chris Hanson 1 December 2008 в 18:31
поделиться

2 ответа

Да, необходимо выполнить в этом Ваш инициализировать и методы загрузки при инициализации globals, который должен только быть инициализирован однажды.

Тем не менее существует много случаев, где можно избежать его...

Вы не должны переноситься с этим условным выражением, если работа должна быть выполнена на каждом inheritant каждого класса:

  • Например, добавляя все наследованные имена классов для каждого класса к набору.
  • отредактированное дополнение: или Вы устанавливаете зависимости KVO (как упомянуто eJames)

Существуют также ситуации, где Вы просто не должны беспокоиться:

  • Если действия, которые Вы выполняете, являются идемпотентом (не изменяйте значения, если повторено),
  • Класс "изолируется" (не имеет никаких потомков дизайном),

"Идемпотентная" часть релевантна. Инициализатор должен просто устанавливать начальное состояние (который должен быть тем же каждым разом). В хорошем инициализаторе не должно иметь значения повторение. Хотя я предполагаю, что, если Вы забываете переносить метод в условное выражение, когда это действительно имеет значение, это могло бы быть раздражающим.

отредактированное дополнение: другой подход, который правильно отражает любые initialize-only-once требования, должен был бы протестировать, если Ваши свойства для инициализации уже инициализируются. т.е.

id myGlobalObject = nil;

+(void)initialize
{
    if (myGlobalObject == nil)
    {
        myGlobalObject = [[MyGlobalClass alloc] init];
    }
}
4
ответ дан 4 December 2019 в 01:32
поделиться

Быстрый ответ: Нет.

Всестороннее обсуждение этого вопроса может быть найдено в списке рассылки разработчика Apple.

Суть его то, что:

  1. Время выполнения будет на самом деле звонить +initialize на суперклассах, прежде чем это назовут на подклассах.
  2. Если Вы действительно включаете защиту, подклассы Вашего класса, которые имеют их собственное +initialize метод не инициирует зависимые уведомления KVO.

Для примера точки № 2, убедиться прочитать это сообщение в упомянутом выше потоке.

5
ответ дан 4 December 2019 в 01:32
поделиться