
Swift - это новый язык для разработки в Xcode IOS и OS X приложений, который имеет более красивый и удобный синтаксис по сравнению с Objective-C, и чем-то напоминает JavaScript.
Типы данных
Int
Double
Float
Bool
String
Character
Запись переменных и констант
//Выводим в консоль
println("Hello, world!");
//Переменнная
var myVariable = 42
//константа
let myConstant = 42
/*в случае, когда переменная "let" указывает на на инстанс
(есть адресом объекта в памяти), то сам объект можно изменять */
//указываем, по желанию, тип явно
let myConstant:Double = 70
//преобразование типов происходит явно:
var myVariable:Double = Double(someIntVar)
//кортеж - новый тип (взят из питона)
//создание кортежа
let digits = (1,"One") //digits is type of (Int,String)
//чтение кортежа данныx
let(num,name) = digits
println("Name \(num) Name:\(name)")
//создание кортежа с пользовательскими ключами
let digits2 = (num:2,name:"Two")
println("Name \(digits2.num) Name:\(digits2.name)")
Строки
//Создаем пустую строку
var str = String()
//Проверка если строка пуста
if str.isEmpty
{
}
//Проверьть длину строки
countElements(str)
//Объединение строк
var str3 = str1+" "+str2
//Итерация строки
var str = "Hello"
for char in str
{
println(char) // каждый символ
}
//Итерация строки через UTF-8
var name = "रवि"; //UTF8-Code 224 164 176 224 164 181 224 164
for code in name.utf8
{
println(code); //каждый UTF8 символ
}
//Форматирование строки
var intVar = 25
var str = "Maks age \(intVar)" //Maks age 33
//Сравнивая строки
if str1 == str2
{
println("Equal")
}
Массивы
//Создать пустой массив
var empty = [];
//Создание инициализированная массив
var names = ["maksim","Haya","Rama"]
var names2:String[] = ["maksim","Haya","Rama"] // с явним типом конвенции
//Получить количество елементов
println(numbers.count)
var numbers = [1,2,4,5,6,7,8]
//Перебор каждого элемента в массиве
for num in numbers
{
println(num)
}
//Другой способ
for (index,value) in enumerate(numbers)
{
println("Index \(index): value \(value)")
}
//Добавления элемента
numbers.append(10);
//Чтобы вставить в указанном индексе
numbers.insert(12,atIndex: 5)
//Удалить элемент с индексом
var removed = numbers.removeAtIndex(0)
//Удалить последний элемент
var removed = numbers.removeLast()
//Создание пустого словаря
var emptyDict = Dictionary<Int,String>();
//Создать словарь с парамертом ключ-значение
var dict1:Dictionary<Int,String> = [ 1:"One",2:"TwO",3:"Three"];
//Или без задания типов
var dict2 = ["1":"One","2":"Two","3":"Three"];
//многомерный
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
//Перебор в словаре
for(key,value) in dict1
{
println("key: \(key) value:\(value)")
}
//Обращение к елементу словаряпо индексу
print(dict["1"]);
dict["1"]="Modifed";
//Обновить элемент
dict1.updateValue("Modified",forKey:"2");
//Добавляем элемент
anArray.append("This String")
//добавляем массив в многомерный массив
anArray += ["Moar", "Strings"]
//Удалить элемент
dict1["1"] = nil;
//или так
dict1.removeValueForKey("1");
Операторы
//If else
var status = true
if status
{
println("YES")
}
else
{
println("NO")
}
//!Важно if принимает только BOOL значение!
//Switch
let char = "a"
switch char
{
case "a","b","c":
println("First Three")
case "x","y","z":
println("Last Three")
case "o":
println("OOO")
default:
println("NONE");
}
//Switch with Range matching
let num = 1
switch num
{
case 0...99:
println("Below 100");
case 100...999:
println("Between 100 & 999")
default:
print("Out of range");
}
//while
var n = 2
while n < 100 {
n = n * 2
}
//do while
var m = 2
do {
m = m * 2
} while m < 100
//for способ 1
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
//Запись ".." не включает 0 и 3 ,а запись "..." включает 0 и 3
//for способ 2
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
Для работы с переменными, которые могут в определенный момент иметь значение nil, при объявлении такой переменной, используем знак условного значения "?". При конвертировании типов все выходные значения есть условными, т.к. конвертирование может вернуть nil. Для приведения условного значения к строгому используют "!"
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
//"Hello, John Appleseed"
Функции
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
//"String" после "->" это тип возращаемого значения
greet("Bob", "Tuesday")
//Если функция возвращает множество значений, следует использовать кортеж
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
//Функции также могут иметь неопределенное число аргументов
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(42, 597, 12)
Конечно же, функции можно вкладывать друг в друга.
Функции являются объектами первого класса (first-class type), иными словами, функция в качестве свого результата может возвращать другую функцию. Детали есть в документации.
Объекты и классы
Для создания класса используется зарезервированное слово class. Члены класса объявляются точно так же, как и обычные константы и переменные. Более того, методы класса объявляются как обычные функции.
class Shape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
Чтобы создать экземпляр (объект) класса, достаточно добавить круглые скобки после названия класса. Доступ к методам и членам класса осуществляется через точку.
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
У методов классов имеется одно важное отличие от функций. Названия аргументов функции используются только в пределах этой функции, тогда как в методе класса параметры также используются при вызове этого метода (кроме первого параметра). По умолчанию метод класса имеет одинаковые названия параметров как при вызове, так и внутри себя. Однако вы можете указать другое название (в примере ниже – times), которое будет использовано только внутри этого метода. При этом для вызова этого метода необходимо использовать первое название (numberOfTimes).
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes times: Int) {
count += amount * times
}
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
При создании экземпляра внутрь кавычек можно передать параметры, они будут использованы в методе init.
Наследование. Ставим двоеточие перед названием родительского класса. Никакого обязательного супер-класса в Swift нет.
Переопределяя методы, перед func пишем "override"
Геттеры и сеттеры
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
instance.perimeter //get
instance.perimeter = 9.9 //set
Если значение перед знаком вопроса равно nil, все, что следует после (?) игнорируется и значение всего выражения равно nil.
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength