LINUX.ORG.RU

Swift 3.0

 


2

3

Официально представлена новая версия языка программирования Swift 3.0.

Swift 3 является первым крупным релизом со времени открытия исходных текстов, в котором представлены значительные улучшения и усовершенствования языка и стандартной библиотеки, большие дополнения в порт под Linux, и первый официальный релиз пакетного менеджера Swift Package Manager.

Порт для Linux теперь поставляется с Swift Core Libraries и Swift Package Manager.

Являясь крупным релизом, Swift 3 привносит изменения, которые делают язык несовместимым с версиями Swift 2.2 и 2.3 на уровне исходных текстов. Эти изменения затрагивают не только названия API стандартной библиотеки, но и то, как импортируются API из Objective-C (в частности из Cocoa) в Swift. Многие изменения в значительной степени являются механическими, и, чтобы помочь перевести проекты на новую версию языка, в Xcode 8.0 добавлен новый инструмент Swift Migrator. Также доступно руководство по миграции на Swift 3.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: DeadEye (всего исправлений: 2)
Ответ на: комментарий от i36_zubov

зачем писать функцию для суммирования?

Для передачи ее в качестве аргумента.

anonymous
()
Ответ на: комментарий от tailgunner

Нет

Дат.

concat(«Привет, », hex(0xff))

охептвоюмать
ну а в функцию то оно как попадет?

или стоп, дай угадаю, что нибудь типа такого придется писать:

func sayHello(name: String, num: Int, fp: float, bool: Boolean) {
    print("Hello, \(\{\:\[name\|num]\|fp\|bool:}?)!")
}

Да?

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

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

uin ★★★
()
Последнее исправление: uin (всего исправлений: 1)
Ответ на: комментарий от uin

То есть я так понимаю ты предлагаешь самому полностью еще и правила для складывания разных типов написать. Здорово.

А оператор сложения ты тоже сам реализуешь или всё-таки пользуешься готовым?

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

Вот это как раз совсем не трудно.

Zenom ★★★
()
Ответ на: комментарий от uin

текст первого вообще не понял

Что и возвращает нас к моему начальному утверждению: «Мы ниасилили нормальную статическую систему типов, поэтому давайте городить динамические костыли»

Zenom ★★★
()
Ответ на: комментарий от RazrFalcon

То есть во время компиляции условный компилятор C++ может смотреть на значения, а не только на их тип?

anonymous
()
Ответ на: комментарий от anonymous

Пример можно увидеть, как это будет выглядеть?

Не знаток плюсов. На той же скалке можно так:

class RangedDouble(val x: Double) {
  x.ensuring(_.abs <= 1.0D)
}

object RangedDouble {
  def apply(literal: Double): RangedDouble = macro RangedDoubleImpl.applyImpl
}
import scala.reflect.macros.blackbox

object RangedDoubleImpl {

  def applyImpl(c: blackbox.Context)(literal: c.Expr[Double]): c.Tree = {
    import c.universe._

    literal.tree match {
      case Literal(Constant(x: Double)) if x.abs <= 1.0D => q"new RangedDouble($x)"
      case _ => c.abort(c.enclosingPosition, "Range exceeded or unknown range")
    }
  }

}
RangedDouble(0.0).x // OK
RangedDouble(2.0).x // Error

В какой-нибудь Аде это вообще встроенная фича языка.

Zenom ★★★
()
Ответ на: комментарий от anonymous

А кто осилил нормальную систему типов за исключением парочки функциональных языков?

Ну вот сабжевый свифт вроде не на последних местах по этому критерию.

Zenom ★★★
()
Ответ на: комментарий от Zenom

а в чем фишка вот этой проверки?

я просто пользуюсь assert/Q_ASSERT и УМВР, а тут какие-то фичи языка нужны. а вот если я значение из файла считал и подал на вход, мне язык тоже предупреждение выдаст? если нет, то зачем такая «фича»?

i36_zubov
()
Ответ на: комментарий от i36_zubov

Ну, каждый, кто пережил хотя бы несколько code review, хоть раз, но оказывался в положении такого пидараса... Я бы не обобщал :)

gns ★★★★★
()
Ответ на: комментарий от Zenom

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

anonymous
()
Ответ на: комментарий от i36_zubov

а в чем фишка вот этой проверки?

Просили продемонстрировать как может компилятор проверять значение. Мне не жалко.

а вот если я значение из файла считал и подал на вход, мне язык

тоже предупреждение выдаст? если нет, то зачем такая «фича»?

А если прочитать из файла значение, которое больше, чем максимально представимое как double, то что будет?

Zenom ★★★
()
Ответ на: комментарий от anonymous

Функциональщина же, это не интересно, я поэтому и просил C++ или Java, где плюсов от статической типизацией не так много

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

ибо обычную проверку типов можно и к любому динамическому языку прикрутить препроцессором

К пистону вон уже долго прикрутить пытаются, да всё никак.

Zenom ★★★
()
Ответ на: комментарий от i36_zubov

а вот если я значение из файла считал и подал на вход, мне язык тоже предупреждение выдаст?

Язык может заставить на месте преобразовать значение в нужный тип.

anonymous
()
Ответ на: комментарий от Zenom

оператор сложения ты тоже сам реализуешь или всё-таки пользуешься готовым?

с оператором ничего не сделаешь, хотя например в жабаскрипте для свойств объекта можно переиначивать/задавать поведение с оператором присвоения, еще что то такое вроде можно в хаскеле. А так (если в языке ничего такого не заложено) через функции типа foo.sum(int: Int, str: String) что собственно у тебя выше и было в примере.

Что и возвращает нас к моему начальному утверждению: «Мы ниасилили нормальную статическую систему типов, поэтому давайте городить динамические костыли»

Если возвращаться к совсем-совсем изначальному, то это в статических языках зачем то придумывают себе костыли что бы можно было какие то плюшки динамических языков получить. Если вам все хватает, зачем вам функции обробатывающие разные типы данных и распознование типов компилятором?
А динамические языки и так в большинстве своем надстройка над статичным кодом.
i36_zubov
Ну это просто как пример, что типы - отдельно, автоматика и алгоритмы - отдельно. Один и тот же алгоритм может хорошо для разных типов данных подходить.

uin ★★★
()
Ответ на: комментарий от uin

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

anonymous
()
Ответ на: комментарий от anonymous

Он может посмотреть на значения уже вбитые в прогу.

Я не знаток шаблонной магии, но к примеру можно так:

class SmallInt {
public:
    template<int N>
    constexpr static SmallInt create() {
        static_assert(N >= -100 && N <= 100, "Invalid value");
        return SmallInt(N);
    }

    int value() const {
        return m_v;
    }

private:
    constexpr SmallInt(int v) : m_v(v) {}

    int m_v;
};

#include <iostream>

void func(const SmallInt &v) {
    std::cout << v.value() << std::endl;
}

int main()
{
    func(SmallInt::create<5>());
    func(SmallInt::create<500>());
    return 0;
}

error: static_assert failed "Invalid value"
RazrFalcon ★★★★★
()
Ответ на: комментарий от uin

Если вам все хватает, зачем вам функции обробатывающие разные типы данных и распознование типов компилятором?

Для гарантий типобезопасности. Для адекватного автокомплита. Для широких возможностей автоматического рефакторинга. Много для чего.

Zenom ★★★
()
Ответ на: комментарий от uin

зачем вам функции обробатывающие разные типы данных и распознование типов компилятором?

google: специализация шаблонов

Может давать очень нехилые ништяки, в том числе и в производительности.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

что значит может заставить.

вот я считал 8 байт в double. я могу проверить их руками, например. или на С++ я напишу класс mydouble который будет во первых plain old data, а во вторых инициализоваться с проверками.

с таким подходом меня и С++ может заставить, точнее я сам себя заставлю сперва. спасибо неизвестному языку программирования за заботу и за то, что эта задача в нем сделана «аппаратно» конечно, и всё такое. но это не киллер-фича.

i36_zubov
()
Ответ на: комментарий от anonymous

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

Вообще динамическая типизация она алгебраически более правильная и понятная, а статическая она, ну просто так сложилось исторически - примитивные компиляторы которым надо было все последовательно указывать. Никому бы просто так в голову бы не пришло придумывать String "Hello World!" ведь уже кавычки есть, это все равно что писать

funct ()
begin {
   /* ... */
end } 

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

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

uin ★★★
()
Последнее исправление: uin (всего исправлений: 1)

Не нужно

anonymous
()
Ответ на: комментарий от uin

А ребята, что всякие Haskell, Idris и тому подобные разрабатывают и не знают, что «динамическая типизация она алгебраически более правильная и понятная». В общем бред, дальше вестись на эти вбросы не буду

anonymous
()
Ответ на: комментарий от uin

а статическая она, ну просто так сложилось исторически

Что за бред у вас в голове? Лисп вышел в 58 лет назад, и он динамический.

Диагноз: помешанный питонщик.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

А что не так сказал? В алгебре нет никаких типов, там только формулы функции и переменные типа (a + b) / 2n. Под правильностью я имел в виду большую схожесть подходов.

uin ★★★
()
Ответ на: комментарий от RazrFalcon

Диагноз: помешанный питонщик.

Назвать этого персонажа «питонщиком» - оскорбление питонщиков.

tailgunner ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну так под него и машины делались тогда специальные.
Эль-76 был то же динамическим к примеру.

uin ★★★
()
Ответ на: комментарий от uin

Никому бы просто так в голову бы не пришло придумывать String «Hello World!» ведь уже кавычки есть, это все равно что писать

Что скажет Ыгсёрд на String 666 Ни те кавычек ни те хрена лысого - ну так что?

Бояться многие разработчики написать тонну говнокода которому где то что то может на вход не то попасть и он или сломается или фокусы показывать начнет. Хотя в этом будет не так уж и сложно разбираться просто тыкнув пальцем в то место которое отвечает за работу того что работает не правильно, посмотреть что приходит на вход/выход и дальше проследовать по ниточке пока не дойдем до того места где у нас все происходит не так как задумывалось и починить.

ТЬФУ! Так ты реально школота сопливая, а я с ним как со взрослым :(

anonymous
()
Ответ на: комментарий от uin

Наоборот: в алгебре есть типы и они очень важны. «a», «b» и «n» принадлежат определенным множествам, а у каждого оператора есть область определения и область значения.

anonymous
()
Ответ на: комментарий от uin

проследовать по ниточке пока не дойдем до того места где у нас все происходит не так как задумывалось и починить.

Вот притащил тебе заказчик мегабайт говнокода на JS, И сказал кейс когда оно падает. ок, ты прошел по стеку вызовов и поправил. Что дальше? Сможешь ли ты дать гарантию что 100500 строк ниже нет такой же ошибки? А вдруг там есть еще другие вызовы с неправильными аргументами? Некорректный код может жить в исходниках годами просто потому что он редко выполняется.

pftBest ★★★★
()
Ответ на: комментарий от uin

Ой какая прелесть! Полугруппу мы в упор не узнаём, но про алгебру рассуждаем!

Zenom ★★★
()
Ответ на: комментарий от uin

Я вот смотрю на Ruby - прекрасный «динамический язык программирования с открытым исходным кодом с упором на простоту и продуктивность».

А его реализация RubyMotion еще прекраснее - в нативный бинарь компилируется (хоть для ios хоть для android). Вот только скорость выполнения этого бинарника МИНИМУМ в 10 (ДЕСЯТЬ) раз меньше свифтовского.

К чему это я? ХЗ.

anonymous
()
Ответ на: комментарий от anonymous

Но информации о типах нигде предварительно указывать не нужно что бы сложить а и б и поделить на n. Если бы алгебра была как статические языки она бы требовала точного указания типов с которым мы работаем.
Похоже на бред? Похоже, если не учитывать что считать будет не мозг а машина.

pftBest
Вот по этому я и не говорю что «статические языки не нужны»
Zenom
Я про алгебру упомянул только в контексте схожести концепции, когда заранее нигде не декларируются к какими типам относятся объявленные переменные, это станет понятно только на этапе присвоения/проброс в функцию каких то значений.

anonymous
Вот только скорость выполнения этого бинарника МИНИМУМ в 10 (ДЕСЯТЬ) раз меньше свифтовского. К чему это я? ХЗ.

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

uin ★★★
()
Ответ на: комментарий от uin

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

/0

pftBest ★★★★
()
Ответ на: комментарий от uin

Кстати вдогонку советую почитать на сайте https://crystal-lang.org «A compiled language with Ruby like syntax and type inference.» Там интересные материалы на тему static vs dynamic и performance есть (если не ошибаюсь).

anonymous
()
Ответ на: комментарий от loyd

Идиот будет называть auto выводом типов.

Т.е. про decltype ты ни слухом ни духом? Впрочем что еще можно было ожидать от тупого тролля.

anonymous
()
Ответ на: комментарий от loyd

Идиот будет называть auto выводом типов.

Но ты же не идиот, верно? Расскажи, почему auto - не вывод типов.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.