var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
var s= [:]
— объявление словаря.
var occupations = [
"Captain", "Mechanic",
]
var s= []
— объявление массива.
willSet, didSet очень крутые конструкции
Позволяют привязаться к свойству объекта не наследуя его и до записи или после записи выполнить свои действия.
Очень понравилось.
Есть ключевое слово Protocol аналог интерфейса, но его можно применять не только к классам, но и структурам и вариантам (Classes, enumerations, and structs)
сложно сказать на сколько это востребовано.
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
Интересное нововведение это mutating позволяющий указать, что метод меняет структуру.
Один и тот же протокол может распространяться на структуру, класс и вариант(в терминах неменрли)
В генериках можно накладывать ограничения на принимаемые типы.
func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
1anyCommonElements([1, 2, 3], [3])
Re: Swift(Apple)
От:
Аноним
Дата:
03.06.14 13:10
Оценка:
! требует что бы ссылка была не nil иначе вываливаеться с ошибкой
let roomCount = john.residence!.numberOfRooms
// this triggers a runtime error
var val=[true,false,false,true]
if let constantName = val[2]
{
}
Иногда достаточно удобно, часто приходиться выносить код до условия.
Было бы хорошо писать даже так
Вариант для немерли
def s=(def k="1".toInt())+if(k==1){k+1}else{k-1};
Еще момент,
nil
и
false
воспринимаются условием как
false
, а любое другое значение
option
как
true
Не знаю на сколько это хорошо, но думаю вполне разумно.
довольно интересно, не совсем понятно зачем сделано различие между локальными именами и внешними именнованными параметрами, но есть короткая форма
func containsCharacter(#string: String, #characterToFind: Character) -> Bool {for character in string {
if character == characterToFind {
return true
}
}
return false
}
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v"
@lazy
отложенное действие
@lazy var importer = DataImporter()
пример использования, не ново, но современный язык без этого не язык
Все глобальные константы по умолчанию @lazy, в то время как все локальные нет. (такое вижу в первые)
mutating методы есть у структур и вариантов (у классов их нет), и данные методы могут возвращать новосозданный данный объект замещая ссылку на предыдущий.
Насколько и когда это полезно со структурами честно говоря сомнительно, ну а с вариантами как я понимаю это в немерли есть (варианты реализованы через классы)
Но пометка методов как изменяющих и как не изменяющих структуру и вариант интересна.
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight is now equal to .High
ovenLight.next()
// ovenLight is now equal to .Off
Методы типа тоже интересная вещь но думаю она уже есть почти везде
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()
Перекрытие геттеров и сеттеров, в немерле есть такое?
class SpeedLimitedCar: Car {
override var speed: Double {
get {
return super.speed
}
set {
super.speed = min(newValue, 40.0)
}
}
}
В инициализаторе можно модифицировать константные свойства.
weak var tenant: Person?
Объявление слабой ссылки, при удалении объекта на который ссылается данная ссылка, ссылка очищается
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
println("One inch is \(oneInch) meters")
// prints "One inch is 0.0254 meters"
let threeFeet = 3.ft
println("Three feet is \(threeFeet) meters")
// prints "Three feet is 0.914399970739201 meters"
let aMarathon = 42.km + 195.m
println("A marathon is \(aMarathon) meters long")
// prints "A marathon is 42195.0 meters long"
интересное расширение типа и в особенности использования его
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 1...digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
0746381295[0]
// returns 5
746381295[1]
// returns 9
4746381295[2]
// returns 2
6746381295[8]
// returns 7
Изврат из стиля, а у нас так можно, а у вас?
Но выглядит и понятно и круто.
&+ &- &* &/ &%
операторы с игнорированием переполнения
uint.Max() &+ 1 //0
uint.Max() + 1 // ошибка времени исполнения
5 % 0 // ошибка времени исполнения
5 &% 0 // 0
Объявление нового оператора
Честно говоря после макросов немерли это выглядит....
Здравствуйте, Аноним, Вы писали:
А>Функциональный со стрелочками и т д...
Убило использование подсчета ссылок без автоматического разруливания за зацикливаний. В 21 веке это выглядит дико. Такому языку нужен GC или хотя бы автоматический поиск зацикливаний, как в Руби.
С экстернал-параметрами какой-то овердизайн. Плюс, похоже, перегрузки возможны только для функций с этими самыми экстернал-параметрами.
Чисто стилистически не понравилась утащенная из GO идея не писать круглые скобки, но всегда писать фигурные.
Плохо, что не поддерживается концепция "все является выражением".
Странно выглядит отсутствие приватных членов в классах (можно я чего-то не заметил?).
В остальном язык ничего. Во многом похож на Немерл.
Из присутствующего в нем и отсутствующего в Немерле можно выделить именованные кортежи в качестве возвращаемых значений функций и диапазоны в паттернах. Хотя не ясно можно ли задавать границы диапазонов переменными.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Swift(Apple)
От:
Аноним
Дата:
03.06.14 17:25
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Аноним, Вы писали:
А>>Функциональный со стрелочками и т д...
VD>Убило использование подсчета ссылок без автоматического разруливания за зацикливаний. В 21 веке это выглядит дико. Такому языку нужен GC или хотя бы автоматический поиск зацикливаний, как в Руби.
По мне правильно. Если заметил, то в языке нет например списков, но есть словари и массивы. Язык подталкивает к аккуратному использованию памяти. Разруливание циклических ссылок зло. К тому же такое легко отследить и поправить просто особенностью деинициализации. Для его области применения это хорошо.
VD>С экстернал-параметрами какой-то овердизайн. Плюс, похоже, перегрузки возможны только для функций с этими самыми экстернал-параметрами.
Тоже так показалось.
VD>Плохо, что не поддерживается концепция "все является выражением".
тут согласен.
VD>Странно выглядит отсутствие приватных членов в классах (можно я чего-то не заметил?).
мда.
VD>В остальном язык ничего. Во многом похож на Немерл.
VD>Из присутствующего в нем и отсутствующего в Немерле можно выделить именованные кортежи в качестве возвращаемых значений функций и диапазоны в паттернах. Хотя не ясно можно ли задавать границы диапазонов переменными.
Еще прикольный if и определения в выражениях.
Здравствуйте, Аноним, Вы писали:
А>Язык подталкивает к аккуратному использованию памяти.
Да ни к чему он не поддакивает. Скорее наоборот. Куча действий которые приводят к незаметному перезаему памяти.
А>Разруливание циклических ссылок зло.
Чей-то? Аргументы?
А>К тому же такое легко отследить и поправить просто особенностью деинициализации. Для его области применения это хорошо.
Это для любой области плохо. И находить утечки вызванные зацикливанием будет ой как не просто.
А>Еще прикольный if и определения в выражениях.
if, как раз невнятный. Котлиновский и немерловый куда лучше. Неявное убирание опционального типа вообще можно только запомнить (ни разу не интуитивно).
Что такое "определения в выражениях" — не понял.
ЗЫ
Еще похоже нет неявного приведения типов. Отсутствие нормальной перегрузки и приведения типов, конечно сильно упрощает вывод типов, но на практике очень неудобно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _NN_, Вы писали:
_NN>Область применения его — телефоны, а там сборщик мусора себя не сильно оправдывает. _NN>Даже в MS создали C++/CX с подсчетом ссылок.
Причем тут телефоны? Это дурь конкретных людей из МС. Возможно им влом было в ядро ОС встраивать ЖЦ.
В Андройде и Виндофоне (для дотнетных приложений) ЖЦ без проблем работает и проблем не вызывает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Swift(Apple)
От:
Аноним
Дата:
04.06.14 15:40
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>В Андройде и Виндофоне (для дотнетных приложений) ЖЦ без проблем работает и проблем не вызывает.
Вызывает как минимум на андроиде. Подвисании приложения особенно игрового это жопа.
Там народ извращается отключением гж. Целые тома написаны.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, VladD2, Вы писали:
VD>>В Андройде и Виндофоне (для дотнетных приложений) ЖЦ без проблем работает и проблем не вызывает.
А>Вызывает как минимум на андроиде. Подвисании приложения особенно игрового это жопа.
Это не просто жопа. Это ложь. От жц ничего не подвисает. Да и игры не подвисают. У меня уже несколько лет ведрофон. Так что не надо мне рассказывать небылицы.
Проблемы с плавность (ушедшие в небытие полировкой андройда) были связаны с архитектурой ОС (Линукса). А там ведь ни грамма на яве не написано.
А>Там народ извращается отключением гж. Целые тома написаны.
Можно хотя бы на один ссылочку привести?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Причем тут телефоны? Это дурь конкретных людей из МС. Возможно им влом было в ядро ОС встраивать ЖЦ.
Swift это замена ObjectiveC , который работает на подсчете ссылок.
Вот и вышел такой язык.
VD>В Андройде и Виндофоне (для дотнетных приложений) ЖЦ без проблем работает и проблем не вызывает.
Apple пока сборщик мусора встраивать не собирается, и так все работает
Здравствуйте, _NN_, Вы писали:
_NN>Swift это замена ObjectiveC , который работает на подсчете ссылок.
Логика потрясающая. По этой логике C# должен был вообще управления памятью не иметь.
_NN>Вот и вышел такой язык.
Думаю, что у Эпла просто нет достойной реализации ЖЦ или в руководстве есть ЖЦ-фобы. Вот и все.
_NN>Apple пока сборщик мусора встраивать не собирается, и так все работает
Подсчет ссылок без автоматического определения и разрыва циклов — это еще тот гимор. Язык сразу на уровень ниже получится. А язык получается не плохой. Почти все фичи Немерла накрыл.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Думаю, что у Эпла просто нет достойной реализации ЖЦ или в руководстве есть ЖЦ-фобы. Вот и все.
Возможно. А еще есть подозрения, что достойную реализацию сделать трудно, т.к. многие полезняшки покрыты патентами в реализациях GC в Java и .NET. Но, если честно, я не копенгаген в этих вопросах.
VD>Подсчет ссылок без автоматического определения и разрыва циклов — это еще тот гимор. Язык сразу на уровень ниже получится.
У них там неплохие тулы есть, которые хорошо отлавливают утечки. Ну и можно делать weak с одного из концов, чтоб дерево получилось — в общем случает не спасает, но при должной сноровке в вопросах самоограничений...
VD>А язык получается не плохой. Почти все фичи Немерла накрыл.
Ага, тоже впечатлился.
Здравствуйте, VladD2, Вы писали:
VD>Причем тут телефоны? Это дурь конкретных людей из МС. Возможно им влом было в ядро ОС встраивать ЖЦ.
VD>В Андройде и Виндофоне (для дотнетных приложений) ЖЦ без проблем работает и проблем не вызывает.
Вызывает, еще как. Мобильному ГЦ нужен просто конский запас по памяти, сравнивая с десктопом.