Как стать автором
Обновить
54
0

Пользователь

Отправить сообщение
В Swift можно использовать тип Either<A, B>. Это позволит нам вернуть пользователю объект как в случае, если все проходит успешно, так и в случае возникновения ошибки. В Swift можно так реализовать тип Either<A, B>:

enum Either<A, B> {
  case Left(A)
  case Right(B)
}


Мы можем использовать Either<NSError, User> в качестве типа, который на финальном этапе преобразований может быть обработан так:

switch either {
  case let .Left(error):
    // показываем сообщение об ошибке (error) 

  case let .Right(user):
    // делаем что-то с user
  }


Мы немного упростили это, предполагая, что Left всегда будет NSError.
Вместо этого используется подобный, но другой тип Result <A>, который будет содержать либо значение, которое мы ищем, либо ошибку. Его реализация выглядит так:

enum Result<A> {
  case Error(NSError)
  case Value(A)
}


В настоящий момент в Swift перечисления enum не могут быть дженериками (generic) на самом топовом уровне, но, могут быть представлены как generic, если их обернуть в «постоянный» class box:

final class Box<A> {
  let value: A

  init(_ value: A) {
    self.value = value
  }
}

enum Result<A> {
  case Error(NSError)
  case Value(Box<A>)
}


И финальное «раскрытие» result: Result <User> будет выглядеть так:

switch result {
  case let .Error(error):
    //  показываем сообщение об ошибке (error) 

  case let .Value(boxedUser):
    let user = boxedUser.value
    // делаем что-то с user
  }
Замечательная статья — плюсую.
Но это лишь самая первая статья Alexandros Salazar из серии блестящих статей, очень осторожно подводящих нас, пришедших из Objective-C и несведущих в основных концепциях функционального программирования, к понятиям Монады (Monads), Функторы, Аппликативные Функторы (Applicative Functors) и Каррирование (Currying) в Swift.
В заключительной статье The Culmination: Final Part (Кульминация — Финальная часть) он приходит к монадическим операторам, которые сейчас отсутствуют в Swift, но по мнению автора являются «Магическим будущим» Swift.
В моем арсенале семь его статей на эту тему.
Продолжайте выкладывать статьи Alexandros Salazar.
В этих статьях с целью краткости и простоты изложения приводится лишь набросок кода, иллюстрирующий ту или иную идею.
Поэтому я изучала его статьи с параллельным кодированием в Swift — «Управление ошибками и Optionals в Swift – интерпретация в коде».
А зачем ждать? Все работает. Есть книжка «Using Swift with Cocoa and Objective-C». Связи Swift c Objective-C отработаны более- менее. Весь Cocoa Touch API подстроен для доступа из Swift. Вперед. Ну а эстетика может подождать. Сам по себе Swift — замечательный.
Конечно, не знаю. Но думаю, что будут, так как слишком много «некрасивостей» в Swift вылезает из Cocoa Touch на Objective-C.
Забыли задачу о Разборчивой невесте, известной в англоязычной литературе как «Secretary problem» или как «marriage problem», «sultan's dowry problem», «fussy suitor problem», «googol game» и как проблема наилучшего выбора.
Она впервые сформулирована Мартином Гарднером в 1960 году.
В 1963 году академик РАН Евгений Дынкин предложил решение этой задачи для частного случая. Общее решение было найдено Сабиром Гусейн-Заде в 1966 году.
Диссертация член-корреспондента РАН не безвестного Бориса Березовского на соискание ученой степени доктора наук, защищенная в 1983 году, является обобщением задачи о разборчивой невесте.
Согласна. Но сейчас держит Cocoa Touch, написанная на Objective-C: весь API оттуда. Если перепишут Cocoa Touch на Swift, то, возможно, будет другой API.
Можно так:

func chained (i:Int) -> Int-> Int -> Int {
    return { j in
        return { k in
            return i + j + k;
        }
    }
}

chained(5)(6)(7)  // playground 18
Вы имели ввиду каррированные функции ( curried functions).
Их можно реализовать в Swift двумя способами:

func add (i:Int, j:Int, k:Int, l:Int) -> Int {return(i + j + k + l)}

// 1-  ый метод

func curry<A,B,C,D,R>(f: (A,B,C,D) -> R) -> A -> B -> C -> D -> R {
    return { a in { b in { c in { d in f(a,b,c,d) } } } }
}

let sum4 = curry (add )

// 2-  ый метод (curried function in Swift)

func sum4Swift(i: Int)(j:Int)(k: Int)(l:Int) -> Int {
    return add(i, j, k, l)
}


sum4 (1)(2)(3)(5)                     // playground 11
sum4Swift (1)(j: 2)(k: 3)(l: 5)    // playground 11

Sorry, это я действительно не в тему.
Но вас-то что раздражает?

Методы выглядят абсолютно одинаково, что в Swft, что в Objective-C

   override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { } //Swift

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {} // Objective-C

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {} //Swift

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {} //Objective-C
<source>

Ну к этому можно привыкнуть, зато как удобно искать методы в Xcode

<img src="" alt=«image»/>
«Магическое» будущее Swift описано в замечательных статьях ALEXANDROS SALAZAR The Culmination: Final Part (есть перевод «Кульминация — финальная часть.),
Swift — язык молодой (декларирован 4 июня 2014 года на WWDC — 2014) и пока все время меняется, даже концептуально. Есть проблемы и ограничения, но Apple team их устраняет от релиза к релизу. Пока, конечно, много критики, но уверена — все сделают в «лучшем » виде, хотя и не сразу.
Я бы не отнесла эту статью к разряду просто пересказа документации. В документации все есть, но в разных местах: часть — в Functions, часть (метод init) — в Classes and Structures, Enumerations. Для тех, кто пришел с Objective C, где все было просто, есть некоторая путаница, когда в методах нужно внешнее имя, а когда — нет. Здесь она собрала все в одном месте. Мне показалось это полезным. Кроме того, следует обратить внимание на автора поста Natasha Murashev — у нее очень интересные посты — короткие и по делу. И, вообще, она сейчас «звезда» Swift сообщества и выступает на всех Swift мероприятиях.
func add (a1:Int, a2:Int) ->Int {return (a1 + a2)}
func multiply (a1:Int, a2:Int) ->Int {return (a1 * a2)}

func funcReturnFunc (funcOperation: (Int,Int) -> Int) -> (Int, Int) ->Int {
   
    return funcOperation
}

func funcReturnFunc2 (funcOperation: (Int,Int) -> Int) -> (Int, Int) ->Int {
    return funcReturnFunc(funcOperation)
}

let returnedFunction = funcReturnFunc2 (multiply)
let returnedFunction1 = funcReturnFunc2 (add)


returnedFunction(5,6)    // Получим 30 на playground
returnedFunction1(5,6)  // Получим 11 на playground

<source>
Нет, никакой «матрешки» нет. Каждый раз курс начинается с основ, но с учетом нововведений новой версии iOS. «Канва» курса (имеется ввиду основные разделы iOS) в основном сохраняется, но одни темы (например, iCloud) могут исчезать, а другие (Dynamic Animation) могут появляться. Меняются демонстрационные примеры и Задания (Assignments). Курс -«живой», но цель — научить вас программировать на iOS c основ, но при условии, что у вас есть хоть какой-то опыт программирования на других языках. В целом, курс — фантастический с точки зрения затраты времени и результата.
Да, конечно, это Стэнфорд сам выкладывает, описка по Фрейду. Это те же самые лекции, которые читаются студентам Стэнфорда — в этом-то их и ценность, там есть видео и слайды — все на английском (на моем сайте все эти ссылки приведены). Никаких конспектов Стэнфорд не дает, есть титры к лекциям.
Я на своем сайте разместила русскую версию конспекта лекций с встроенными русифицированными слайдами и хронометрированием по времени, чтобы у тех, кто не владеет английским свободно, создавалось впечатление полноценного присутствия на лекции.
Если вы свободно владеете английским и для вас не проблема понимания со слуха, наверно, для вас это менее интересно. Но участвуя в обучении типа «Сoding Together» и в группах типа Russian Study Group, я поняла, что есть много русскоговорящих студентов, которые хотят изучать программирование iOS, но язык не пускает. Мой сайт — для них. И хотя эти курсы для «продвинутых», курса начинается с очень подробного «разжевывания» основ программирования на iOS. Так что добро пожаловать начинающим.
Но не только!
Хотя я в программировании iOS 4 года, я получила очень много дополнительной информации с этих лекций, так как профессор открывает для вас много незнакомых нюансов и подходов. Конечно, если вы подробно изучаете его материалы, а не прослушали курс «в общих чертах».
Да, курсов по Swift — шквал. Но большей частью — это курсы для начинающих, особенно Udemy, а Стэнфордский курсы имеют уровень — advanced, продвинутый. Да и тема вовсе не Swift, а iOS 8, а будет ли Swift или (Swift + Objective-C ) или просто Objective-C?? — не знаю. Они выкладывают их на iTunes совершенно бесплатно. Такого уровня и объема другие бесплатные курсы по iOS мне не известны.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность