Swift — как преобразовать string в double

let VS const

Различия между и мы выяснили, а что насчёт ? Получается, что и почти одно и тоже. И всё же есть одно отличие: значение переменной, объявленной с помощью , нельзя переназначить. Это можно увидеть в примере ниже:

let name = 'Tyler'const handle = 'tylermcginnis'name = 'Tyler McGinnis' // handle = '@tylermcginnis' //  TypeError: Assignment to constant variable.

Итак, если вы хотите, чтобы переменная была неизменной, используйте . Ну, почти. На самом деле оператор не делает переменную неизменной, а только не даёт переназначать её значение. Вот хороший пример:

const person = {  name: 'Kim Kardashian'}person.name = 'Kim Kardashian West' // person = {} //  Assignment to constant variable.

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

Теперь главный вопрос: что следует использовать , , или ? Наиболее популярное мнение, под которым подписываюсь и я, — всегда использовать , кроме тех случаев, когда вы знаете, что переменная будет изменятся. Используя , вы как бы говорите себе будущему и другим разработчикам, которые будут читать ваш код, что эту переменную изменять не следует. Если вам нужна изменяемая переменная (например, в цикле ), то используйте .

Таким образом, между изменяемыми и неизменяемыми переменными осталось не так много различий. Это означает, что вам больше не придётся использовать .

Теперь «непопулярное» мнение, хотя оно и обоснованно (пока): вы никогда не должны использовать const, потому что, хотя вы пытаетесь показать, что переменная неизменна, это не совсем правда (мы видели это на примере выше). Разработчики, которые разделяют это мнение, всегда используют , за исключением случаев когда переменная действительно является константой, например .

Повторим для закрепления. Область видимости переменных ограничена функцией, если вы обратитесь к переменной до её объявления, то получите . и ограничены блоком, а попытка обратится к переменной до её объявления, вернётся ошибкой ReferenceError. И наконец, разница между и в том, что в первом случае вы можете изменить значение переменной, а во втором нет.

var VS let VS constvar:   function scoped  undefined when accessing a variable before it's declaredlet:   block scoped  ReferenceError when accessing a variable before it's declaredconst:  block scoped  ReferenceError when accessing a variable before it's declared  can't be reassigned

5 ответов

Вместо того, чтобы искать в Google , вы должны были искать функцию .

означает «форматировать целое число двумя цифрами, заполняя его нулями слева», поэтому:

Format  Data   Result
%02d    1      01
%02d    11     11

55

Anax
31 Июл 2010 в 10:27

Они форматируют . Специфический синтаксис Java приведен в .

Общий синтаксис следующий:

выполняет десятичное целочисленное преобразование , отформатированное с заполнением нулями (флаг ), с шириной . Таким образом, аргумент , значение которого, скажем, , будет отформатирован в как .

Вы также можете увидеть эту строку форматирования, например, в .

Часто используемые форматы

Это лишь некоторые из наиболее часто используемых форматов, которые не охватывают исчерпывающим образом синтаксис.

Ширина для обоснования

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

Это печатает что-то вроде:

Для более эффективного форматирования сообщений вы можете использовать . — это преобразование новой строки (см. Ниже).

для действительного знака

Обратите внимание, что литерал автоматически упаковывается в , для которого определено преобразование строки с использованием

Связанные вопросы

  • Почему формат String (Object… args) определен как статический метод?
  • экранирование символов форматирования в java String.format
  • Лучше ли использовать String.format вместо конкатенации строк в Java?
  • Следует ли использовать Java String.format (), если важна производительность?
  • Понимание символа $ в строках формата Java
  • java десятичный формат строки
  • разница между system.out.printf и String.format
  • Какие классы вы используете для создания строковых шаблонов? — с примером

32

Community
23 Май 2017 в 12:25

Ответ Александра относится к полным документам …

Ваш простой пример из вопроса просто распечатывает эти значения с двумя цифрами — при необходимости добавляя ведущий 0.

Daniel Bleisteiner
31 Июл 2010 в 10:26

Статья посвящена классу функций printf на нескольких языках с 50-х годов до наших дней.

Marco Mariani
31 Июл 2010 в 10:31

% — это специальный символ, который вы помещаете в строки формата, например, в printf и scanf (и семейство) языка C, который в основном говорит «это заполнитель для чего-то еще, не для печати / читать буквально. «

То же самое касается Java и других языков :)

Community
20 Июн 2020 в 09:12

Специальные символы для выражений форматов

Символы для форматов даты и времени

Символ Описание
Точка (.) Разделитель компонентов даты (день, месяц, год). Используется при отображении месяца в виде числа.
Пробел Разделитель компонентов даты (день, месяц, год). Используется при отображении месяца прописью.
Двоеточие (:) Разделитель компонентов времени (часы, минуты, секунды).
d День в виде числа без нуля в начале (1–31).
dd День в виде числа с нулем в начале (01–31).
m Месяц в виде числа без нуля в начале (1–12). Если (m) следует после (h) или (hh), отображаются минуты (0–59).
mm Месяц в виде числа с нулем в начале (01–12). Если (mm) следует после (h) или (hh), отображаются минуты (00–59).
mmm Месяц прописью в сокращенном виде (янв–дек).
mmmm Полное название месяца (январь–декабрь).
y День года в виде числа (1–366).
yy Год в виде 2-значного числа (00–99).
yyyy Год в виде 4-значного числа (1900–9999).
h Часы в виде числа без нуля в начале (0–23).
hh Часы в виде числа с нулем в начале (00–23).
n (m) Минуты в виде числа без нуля в начале (0–59).
nn (mm) Минуты в виде числа с нулем в начале (00–59).
s Секунды в виде числа без нуля в начале (0–59).
ss Секунды в виде числа с нулем в начале (00–59).

В этой таблице перечислены далеко не все символы для выражений форматов даты и времени. Вы можете ознакомиться со всеми символами, в том числе и для форматирования чисел, на сайте разработчика.

Примеры отображения даты с помощью разных по количеству наборов символа d:

1
2
3
4
5
6
7
8

SubDataIsD()

MsgBox»d:  «&Format(Now,»d»)&vbNewLine_

&vbNewLine&»dd:  «&Format(Now,»dd»)&vbNewLine_

&vbNewLine&»ddd:  «&Format(Now,»ddd»)&vbNewLine_

&vbNewLine&»dddd:  «&Format(Now,»dddd»)&vbNewLine_

&vbNewLine&»ddddd:  «&Format(Now,»ddddd»)&vbNewLine_

&vbNewLine&»dddddd:  «&Format(Now,»dddddd»)

EndSub

Символы для числовых форматов

Символ Описание
Точка (.) Десятичный разделитель.
Запятая (,) Разделитель групп разрядов. В отображаемых числах заполняется пробелом.
(0) Заполнитель, который отображает цифру или ноль. Используется, когда нужны ведущие нули или нули в конце числа.
(#) Заполнитель, который отображает цифру или ничего не отображает. Используется, когда не нужны ведущие нули или нули в конце числа.
(%) Заполнитель процента. Выражение умножается на 100, а знак процента (%) вставляется на той позиции, где он указан в строке формата.
(E- E+ e- e+) Экспоненциальный формат.

Примеры использования символов в выражениях числовых форматов VBA Excel:

1
2
3
4
5
6
7
8
9
10
11
12

SubFormatNumber2()

DimnAsDouble

n=2641387.7381962

‘n = 0.2397842

MsgBox»Форматируемое число = «&n&vbNewLine_

&vbNewLine&»0.##:  «&Format(n,»0.##»)&vbNewLine_

&vbNewLine&»000.###:  «&Format(n,»000.###»)&vbNewLine_

&vbNewLine&»#,###.###:  «&Format(n,»#,###.###»)&vbNewLine_

&vbNewLine&»0 %:  «&Format(n,»0 %»)&vbNewLine_

&vbNewLine&»0.### E-:  «&Format(n,»0.### E-«)&vbNewLine_

&vbNewLine&»0.### E+:  «&Format(n,»0.### E+»)

EndSub

Символы для текстовых форматов

Символ Описание
At-символ (@) Заполнитель для символов, отображающий знак или пробел.
Амперсанд (&) Заполнитель для символов, отображающий знак или ничего (пустая строка).
Меньше (<) Принудительный перевод всех буквенных символов в нижний регистр.
Больше (>) Принудительный перевод всех буквенных символов в верхний регистр.

Примеры использования символов в выражениях строковых форматов VBA Excel:

1
2
3
4
5
6

SubFormatString()

MsgBox»Номер телефона:  «&Format(«1234567890″,»+7 (@@@) @@@-@@-@@»)&vbNewLine_

&vbNewLine&»Серия и номер паспорта:  «&Format(«1234567890″,»&& && &&&&»)&vbNewLine_

&vbNewLine&»Нижний регистр:  «&Format(«Нижний регистр»,»<«)&vbNewLine_

&vbNewLine&»Верхний регистр: «&Format(«Верхний регистр»,»>»)

EndSub

Приведение типа

В C++ существует 5 различных видов приведений типа: приведения в стиле C, статические приведения, константные приведения, динамические приведения и реинтерпретирующие приведения. Последние четыре иногда называют именованными приведениями.

В этом уроке мы рассмотрим приведение типа в стиле C и статическое приведение.

Связанный контент

Динамические приведения мы рассмотрим в уроке «18.10 – Динамическое преобразование типов» после того, как рассмотрим другие необходимые темы.

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

Предупреждение

Избегайте константных приведений и реинтерпретирующих приведений, если у вас нет веской причины их использовать.

Именованные выражения форматов

Именные форматы даты и времени

Имя формата Описание
General Date Стандартное отображение даты и времени в соответствии с параметрами системы.
Long Date Длинный формат даты.
Medium Date Средний формат даты.
Short Date Краткий формат даты.
Long Time Длинный формат времени.
Medium Time Средний формат времени.
Short Time Краткий формат времени.

Проверьте отображение даты и времени с использованием именованных форматов на вашем компьютере при помощи следующего кода VBA Excel:

1
2
3
4
5
6
7
8
9

SubFormatDateTime()

MsgBox»General Date:  «&Format(Now,»General Date»)&vbNewLine_

&vbNewLine&»Long Date:  «&Format(Now,»Long Date»)&vbNewLine_

&vbNewLine&»Medium Date:  «&Format(Now,»Medium Date»)&vbNewLine_

&vbNewLine&»Short Date:  «&Format(Now,»Short Date»)&vbNewLine_

&vbNewLine&»Long Time:  «&Format(Now,»Long Time»)&vbNewLine_

&vbNewLine&»Medium Time:  «&Format(Now,»Medium Time»)&vbNewLine_

&vbNewLine&»Short Time:  «&Format(Now,»Short Time»)

EndSub

Скорее всего, результат будет таким:

Именованные форматы чисел

Имя формата Описание
General Number Стандартное отображение числа без знака разделителя групп разрядов.
Currency Денежный формат.
Fixed Отображение числа без знака разделителя групп разрядов с двумя цифрами после разделителя целой и дробной части.
Standard Отображение числа со знаком разделителя групп разрядов и с двумя цифрами после разделителя целой и дробной части.
Percent Процентный формат: отображение числа, умноженного на 100, со знаком процента (%), добавленного справа.
Scientific Отображение числа в экспоненциальном виде.
Yes/No Возвращается «Нет», если число равно 0, иначе отображается «Да».
True/False Возвращается «Ложь», если число равно 0, иначе отображается «Истина».
On/Off Возвращается «Выкл», если число равно 0, иначе отображается «Вкл».

Проверяем работу именованных форматов на числах 2641387.7381962 и с помощью кода VBA Excel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

SubFormatNumber()

DimnAsDouble

n=2641387.7381962

‘n = 0

MsgBox»Форматируемое число = «&n&vbNewLine_

&vbNewLine&»General Number:  «&Format(n,»General Number»)&vbNewLine_

&vbNewLine&»Currency:  «&Format(n,»Currency»)&vbNewLine_

&vbNewLine&»Fixed:  «&Format(n,»Fixed»)&vbNewLine_

&vbNewLine&»Standard:  «&Format(n,»Standard»)&vbNewLine_

&vbNewLine&»Percent:  «&Format(n,»Percent»)&vbNewLine_

&vbNewLine&»Scientific:  «&Format(n,»Scientific»)&vbNewLine_

&vbNewLine&»Yes/No:  «&Format(n,»Yes/No»)&vbNewLine_

&vbNewLine&»True/False:  «&Format(n,»True/False»)&vbNewLine_

&vbNewLine&»On/Off:  «&Format(n,»On/Off»)

EndSub

Получаем следующий результат:

Вместо вопросительного знака в отображении числа в формате Currency, по идее, должен быть знак валюты (₽ или руб.).

Error Handling¶

You use error handling to respond to error conditions your program may encounter during execution.

In contrast to optionals, which can use the presence or absence of a value to communicate success or failure of a function, error handling allows you to determine the underlying cause of failure, and, if necessary, propagate the error to another part of your program.

When a function encounters an error condition, it throws an error. That function’s caller can then catch the error and respond appropriately.

  1. func canThrowAnError() throws {
  2. // this function may or may not throw an error
  3. }

A function indicates that it can throw an error by including the keyword in its declaration. When you call a function that can throw an error, you prepend the keyword to the expression.

Swift automatically propagates errors out of their current scope until they’re handled by a clause.

  1. do {
  2. try canThrowAnError()
  3. // no error was thrown
  4. } catch {
  5. // an error was thrown
  6. }

A statement creates a new containing scope, which allows errors to be propagated to one or more clauses.

Here’s an example of how error handling can be used to respond to different error conditions:

  1. func makeASandwich() throws {
  2. // …
  3. }
  4. do {
  5. try makeASandwich()
  6. eatASandwich()
  7. } catch SandwichError.outOfCleanDishes {
  8. washDishes()
  9. } catch SandwichError.missingIngredients(let ingredients) {
  10. buyGroceries(ingredients)
  11. }

In this example, the function will throw an error if no clean dishes are available or if any ingredients are missing. Because can throw an error, the function call is wrapped in a expression. By wrapping the function call in a statement, any errors that are thrown will be propagated to the provided clauses.

If no error is thrown, the function is called. If an error is thrown and it matches the case, then the function will be called. If an error is thrown and it matches the case, then the function is called with the associated value captured by the pattern.

Исключения преобразования типов во время выполнения

В некоторых преобразованиях ссылочных типов компилятор не может определить, будет ли приведение допустимым. Есть вероятность, что правильно скомпилированная операция приведения завершится сбоем во время выполнения. Как показано в следующем примере, приведение типа, завершившееся сбоем во время выполнения, вызывает исключение InvalidCastException.

Метод имеет параметр , поэтому явное приведение аргумента к формирует опасное допущение. Более безопасно будет не делать допущений, а проверить тип. C# предоставляет оператор , чтобы можно было проверить совместимость перед фактическим выполнением приведения. Дополнительные сведения см. в статье Практическое руководство. Безопасное приведение с помощью сопоставления шаблонов, а также операторов is и as.

Числовое преобразование в JavaScript

Числовое преобразование:

    1. явное: функция Number(value);
    2. неявное:
      • арифметические операции (кроме бинарного +);
      • нестрогое сравнение разных типов (==, включая !=);
      • унарный оператор + (например, +’58’, +true и т.п.);
      • функции parseInt  и parseFloat.

Особенности числового преобразования:

  1. true → 1;
  2. false → 0;
  3. undefined → NaN;
  4. null → 0 (см. исключения);
  5. “text” → NaN;
  6. «» (пустая строка) → 0;
  7. null == undefined.

Оператор + — быстрейший и предпочитаемый способ конвертирования чего-либо в число потому, что он не выполняет каких-либо операций с числом. Он может конвертировать строковые представления целых и чисел с плавающей точкой, а также нестроковые значения true, false и null. Поддерживаются числа в десятичном и шестнадцатиричном (с префиксом «0x») формате. Отрицательные числа тоже поддерживаются (но не 16-ричные). Если он не может вычислить конкретное значение, вернет NaN.

Примеры числового преобразования:

Number(123); // 123
Number(«12»); // 12
Number(«-12.34»); // -12.34
Number(«12s»); // NaN
Number(true); // 1
Number(false); // 0
Number(undefined); // NaN
Number(null); // 0
Number(«\n»); // 0

1
2
3
4
5
6
7
8
9

Number(123);// 123

Number(«12»);// 12

Number(«-12.34»);// -12.34

Number(«12s»);// NaN

Number(true);// 1

Number(false);// 0

Number(undefined);// NaN

Number(null);// 0

Number(«\n»);// 0

// Неявное преобразование
typeof +»123″;
123 != «456»;
4 > «5»;
5 / null;
true | 0; // побитовое ИЛИ

// Функция parseInt возвращает целое число, а parseFloat возвращает число с плавающей точкой
// символы, не являющиеся цифрами, отсекаются (но только не в начале строки!)
parseInt(«200px»); // 200 (для целых чисел)
parseFloat(«200.456px»); // 200.456 (для дробных чисел)

1
2
3
4
5
6
7
8
9
10
11

// Неявное преобразование

typeof+»123″;

123!=»456″;

4>»5″;

5null;

true|;// побитовое ИЛИ

 
// Функция parseInt возвращает целое число, а parseFloat возвращает число с плавающей точкой
// символы, не являющиеся цифрами, отсекаются (но только не в начале строки!)

parseInt(«200px»);// 200 (для целых чисел)

parseFloat(«200.456px»);// 200.456 (для дробных чисел)

Команда if со списками.

С помощью команды if, например при переборе списка, возможно использовать каждый элемент на свое усмотрение.

>>> cars =
>>> for brand in cars:
…     if brand == ‘audi’
…             print(f»Гарантия на автомобиль {brand.title()} 2 года»)
…     elif brand == ‘bmw’
…             print(f»Гарантия на автомобиль {brand.title()} 3 года»)
…     else:
…             print(f»Гарантия на автомобиль {brand.title()} 5 лет»)
…Гарантия на автомобиль Ford 5 лет
Гарантия на автомобиль Opel 5 лет
Гарантия на автомобиль Audi 2 года
Гарантия на автомобиль Land Rover 5 лет
Гарантия на автомобиль Bmw 3 года

В данном примере с помощью команды мы перебираем весь список автомобилей. Если марка автомобиля соответствует условия if-elif, то выводится для этих марок свое сообщение по условиям гарантии. В случае не совпадения условий, выдается общее сообщение для всех остальных марок. 

Please enable JavaScript to view the comments powered by Disqus.

Понижающее приведение

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

Поскольку принижение может быть неудачным, оператор приведения типов может быть двух разных форм. Условная форма, возвращает необязательное значение типа, который вы пытаетесь уменьшить. Принудительная форма, пытается выполнить снижение и принудительно разворачивает результат как одно сложное действие.

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

Используйте форсированную форму оператора приведения типа ( ) только в том случае, если вы уверены, что снижение всегда будет успешным. Эта форма оператора вызовет ошибку времени выполнения, если вы попытаетесь снизить класс до неправильного типа.

В приведенном ниже пример итерации по каждому в , и выводит соответствующее описание для каждого пункта. Для этого ему необходимо получить доступ к каждому элементу как true или , а не просто как . Это необходимо для того, чтобы иметь возможность получить доступ к или свойству или для использования в описании.

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

Пример начинается с попытки уменьшить текущее значение как . Поскольку это пример, возможно, что это может быть ; в равной степени возможно также, что это может быть или даже просто база . Из-за этой неопределенности форма оператора приведения типа возвращает необязательноезначение при попытке перехода к типу подкласса. Результат имеет тип или «необязательный ».

Снижение до сбоя при применении к экземплярам в массиве библиотеки. Чтобы справиться с этим, в приведенном выше примере используется необязательная привязка, чтобы проверить, действительно ли необязательная содержит значение (то есть, чтобы выяснить, прошел ли переход вниз). Эта необязательная привязка записывается как « », которую можно прочитать как:

«Попробуй доступ как . Если это успешно, установите новую временную константу, вызываемую к значению, сохраненному в возвращаемом дополнительном . ”

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

Список кодов форматов

В таблице ниже показаны все коды формата, которые вы можете использовать:

Директива Значение Пример
% a Сокращенное название дня недели. Вс, пн, …
% А Полное название дня недели. Воскресенье понедельник, …
%w День недели в виде десятичного числа. 0, 1, …, 6
% d День месяца в виде десятичной дроби с нулями. 01, 02, …, 31
% -d День месяца в виде десятичного числа. 1, 2, …, 30
% b Сокращенное название месяца. Янв, Фев, …, Дек
% B Полное название месяца. Январь Февраль, …
% m Месяц как десятичное число с нулями. 01, 02, …, 12
% -m Месяц как десятичное число. 1, 2, …, 12
% y Год без века как десятичное число с нулями. 00, 01, …, 99
% -y Год без столетия как десятичное число. 0, 1, …, 99
% Y Год со столетием в виде десятичного числа. 2013, 2019 и т. Д.
%H Час (в 24-часовом формате) как десятичное число с нулями. 00, 01, …, 23
%-H Час (24-часовой формат) как десятичное число. 0, 1, …, 23
%I Час (12-часовой формат) как десятичное число с нулями. 01, 02, …, 12
%-I Час (12-часовой формат) в виде десятичного числа. 1, 2, … 12
%p Локализация AM или PM. до полудня, после полудня
% M Минута в виде десятичного числа с нулями. 00, 01, …, 59
% -M Минута как десятичное число. 0, 1, …, 59
% S Второй — десятичное число с нулями. 00, 01, …, 59
% -S Секунда как десятичное число. 0, 1, …, 59
% f Микросекунда в виде десятичного числа с нулями слева. 000000–999999
%z Смещение UTC в форме + ЧЧММ или -ЧЧММ.
%Z Название часового пояса.
% j День года в виде десятичного числа с нулями. 001, 002, …, 366
% -j День года в виде десятичного числа. 1, 2, …, 366
% U Номер недели в году (воскресенье как первый день недели). Все дни нового года, предшествующие первому воскресенью, считаются нулевой неделей. 00, 01, …, 53
%W Номер недели в году (понедельник как первый день недели). Все дни нового года, предшествующие первому понедельнику, считаются нулевой неделей. 00, 01, …, 53
% c Соответствующее представление даты и времени языкового стандарта. 30 сен, пн, 07:06:05 2013
%x Соответствующее представление даты языкового стандарта. 30.09.13
%X Соответствующее представление времени локали. 07:06:05
%% Буквальный символ «%». %

Определение иерархии классов для приведения типов

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

Первый фрагмент определяет новый базовый класс с именем . Этот класс предоставляет базовые функциональные возможности для любого вида элемента, который появляется в библиотеке цифрового мультимедиа. В частности, он объявляет свойство типа и инициализатор. (Предполагается, что все элементы мультимедиа, включая все фильмы и песни, будут иметь название.)

Следующий фрагмент определяет два подкласса . Первый подкласс содержит дополнительную информацию о фильме или фильме. Он добавляет свойство поверх базового класса с соответствующим инициализатором. Второй подкласс добавляет свойство и инициализатор поверх базового класса:

Последний фрагмент создает постоянный массив с именем , который содержит два экземпляра и три экземпляра. Тип массива определяется путем его инициализации содержимым литерала массива. Средство проверки типов Swift может вывести это и иметь общий суперкласс , и поэтому оно выводит тип для массива:

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

Проверка типа

Используйте оператор проверки типа ( ), чтобы проверить, принадлежит ли экземпляр определенному типу подкласса. Оператор проверки типа возвращает, если экземпляр принадлежит к этому типу подкласса, и если это не так.

Приведенный ниже пример определяет две переменные, и , которые подсчитывают количество и экземпляры в массиве:

Этот пример перебирает все элементы в массиве. На каждом проходе цикл — устанавливает константу для следующего в массиве.

возвращает, если текущий является экземпляром, и если это не так. Аналогичным образом проверяется, является ли элемент экземпляром. В конце — петли, значения и содержат счет того , сколько экземпляров были обнаружены каждого типа.

Type Casting for Any and AnyObject¶

Swift provides two special types for working with nonspecific types:

  • can represent an instance of any type at all, including function types.
  • can represent an instance of any class type.

Use and only when you explicitly need the behavior and capabilities they provide. It’s always better to be specific about the types you expect to work with in your code.

Here’s an example of using to work with a mix of different types, including function types and nonclass types. The example creates an array called , which can store values of type :

  1. var things: = []
  2. things.append()
  3. things.append(0.0)
  4. things.append(42)
  5. things.append(3.14159)
  6. things.append(«hello»)
  7. things.append((3.0, 5.0))
  8. things.append(Movie(name: «Ghostbusters», director: «Ivan Reitman»))
  9. things.append({ (name: String) -> String in «Hello, \(name)» })

The array contains two values, two values, a value, a tuple of type , the movie “Ghostbusters”, and a closure expression that takes a value and returns another value.

To discover the specific type of a constant or variable that’s known only to be of type or , you can use an or pattern in a statement’s cases. The example below iterates over the items in the array and queries the type of each item with a statement. Several of the statement’s cases bind their matched value to a constant of the specified type to enable its value to be printed:

  1. for thing in things {
  2. switch thing {
  3. case as Int:
  4. print(«zero as an Int»)
  5. case as Double:
  6. print(«zero as a Double»)
  7. case let someInt as Int:
  8. print(«an integer value of \(someInt)»)
  9. case let someDouble as Double where someDouble > :
  10. print(«a positive double value of \(someDouble)»)
  11. case is Double:
  12. print(«some other double value that I don’t want to print»)
  13. case let someString as String:
  14. print(«a string value of \»\(someString)\»»)
  15. case let (x, y) as (Double, Double):
  16. print(«an (x, y) point at \(x), \(y)»)
  17. case let movie as Movie:
  18. print(«a movie called \(movie.name), dir. \(movie.director)»)
  19. case let stringConverter as (String) -> String:
  20. print(stringConverter(«Michael»))
  21. default:
  22. print(«something else»)
  23. }
  24. }
  25. // zero as an Int
  26. // zero as a Double
  27. // an integer value of 42
  28. // a positive double value of 3.14159
  29. // a string value of «hello»
  30. // an (x, y) point at 3.0, 5.0
  31. // a movie called Ghostbusters, dir. Ivan Reitman
  32. // Hello, Michael

Note

The type represents values of any type, including optional types. Swift gives you a warning if you use an optional value where a value of type is expected. If you really do need to use an optional value as an value, you can use the operator to explicitly cast the optional to , as shown below.

  1. let optionalNumber: Int? = 3
  2. things.append(optionalNumber) // Warning
  3. things.append(optionalNumber as Any) // No warning

Приведение типов для Any и AnyObject

Swift предоставляет два специальных типа для работы с неспецифическими типами:

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

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

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

Массив содержит два значения, два значения, а значение, кортеж типа , фильм «Гостбастерс», а выражение закрытия , которая принимает значение и возвращает другое значение.

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

Использование приведения типов, чтобы сделать неявное преобразование типов явным

Компиляторы часто жалуются на небезопасное (сужающее) неявное преобразование типа. Например, рассмотрим следующую программу:

Преобразование (4 байта) в (1 байт) потенциально небезопасно (поскольку компилятор не может определить, будет ли целое число выходить за пределы диапазона или нет), поэтому компилятор обычно выводит предупреждение. Если бы мы использовали инициализацию списком, компилятор выдал бы ошибку.

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

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

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

Чтобы сообщить компилятору, что мы преднамеренно хотим это сделать, можно написать так:

Булево (логическое) преобразование в JavaScript

  • явное — функция Boolean(value) ;
  • неявное:
    1. в логическом контексте if (val) { … } или
    2. при применении логических операторов ( || , && , ! ) (приводят значение операндов к логическому типу, но возвращают исходные операнды , которые могут иметь тип, отличный от логического).

Особенности булева преобразования:

    1. Boolean(«», null, undefined, NaN, false, 0, -0) → false;
    2. Boolean(2016, ‘string’, {}, [], любой объект или массив, даже пустые) → true.

Замечание: Boolean можно заменить двойным отрицанием — !!, которое также преобразует значения к логическому типу:

JavaScript

alert( !!»non-empty string» ); // true
alert( !!null ); // false

1
2

alert(!!»non-empty string»);// true

alert(!!null);// false

Подробнее о логических операторах

Логические операторы ( || , && , ! ) обычно используются с булевыми (логическими) значениями, при этом возвращаемое ими значение также является булевым.

Оператор  Использование  Описание
Логическое И (&&)  expr1 && expr2 (Логическое И)

Таким образом, при использовании булевых величин в качестве операндов, оператор && возвращает true, если оба операнда true; в противном случае возвращает false.

Логическое ИЛИ (||)  expr1 || expr2 (Логическое ИЛИ)

Таким образом, при использовании булевых величин в качестве операндов, оператор || возвращает true, если один из операндов true; если же оба false, то возвращает false.

Логическое НЕ (!)  !expr (Логическое НЕ)

Использование оператора || (ИЛИ) для задания значений по умолчанию:

let userAge = {
age: null,
setAge(age) {
this.age = age || 10;
},
};

userAge.setAge(); // не передаем аргументы в метод
console.log(userAge.age); // 10

userAge.setAge(25);
console.log(userAge.age); // 25

1
2
3
4
5
6
7
8
9
10
11
12

let userAge={

agenull,

setAge(age){

this.age=age||10;

},

};

userAge.setAge();// не передаем аргументы в метод

console.log(userAge.age);// 10

userAge.setAge(25);

console.log(userAge.age);// 25

Примеры

Следующий код демонстрирует примеры использования оператора && (логическое И).

var a1 = true && true; // t && t возвращает true
var a2 = true && false; // t && f возвращает false
var a3 = false && true; // f && t возвращает false
var a4 = false && (3 == 4); // f && f возвращает false
var a5 = «Cat» && «Dog»; // t && t возвращает Dog
var a6 = false && «Cat»; // f && t возвращает false
var a7 = «Cat» && false; // t && f возвращает false
value = «» && !null; // «» (возвращается первый операнд), так как пустая строка может быть преобразована к false

1
2
3
4
5
6
7
8

vara1=true&&true;// t && t возвращает true

vara2=true&&false;// t && f возвращает false

vara3=false&&true;// f && t возвращает false

vara4=false&&(3==4);// f && f возвращает false

vara5=»Cat»&&»Dog»;// t && t возвращает Dog

vara6=false&&»Cat»;// f && t возвращает false

vara7=»Cat»&&false;// t && f возвращает false

value=»»&&!null;// «» (возвращается первый операнд), так как пустая строка может быть преобразована к false

Следующий код демонстрирует примеры использования оператора || (логическое ИЛИ).

var o1 = true || true; // t || t возвращает true
var o2 = false || true; // f || t возвращает true
var o3 = true || false; // t || f возвращает true
var o4 = false || (3 == 4); // f || f возвращает false
var o5 = «Cat» || «Dog»; // t || t возвращает Cat
var o6 = false || «Cat»; // f || t возвращает Cat
var o7 = «Cat» || false; // t || f возвращает Cat
value = !!»» || false; // false
value = !!»» || null; // null
value = !!» » || null; // true

1
2
3
4
5
6
7
8
9
10

varo1=true||true;// t || t возвращает true

varo2=false||true;// f || t возвращает true

varo3=true||false;// t || f возвращает true

varo4=false||(3==4);// f || f возвращает false

varo5=»Cat»||»Dog»;// t || t возвращает Cat

varo6=false||»Cat»;// f || t возвращает Cat

varo7=»Cat»||false;// t || f возвращает Cat

value=!!»»||false;// false

value=!!»»||null;// null

value=!!» «||null;// true

Следующий код демонстрирует примеры использования оператора ! (логическое НЕ).

var n1 = !true; // !t возвращает false
var n2 = !false; // !f возвращает true
var n3 = !»Cat»; // !t возвращает false
value = !!»» || !null; // true

1
2
3
4

varn1=!true;// !t возвращает false

varn2=!false;// !f возвращает true

varn3=!»Cat»;// !t возвращает false

value=!!»»||!null;// true

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: