Pull to refresh

Comments 12

Честно говоря, сомнительная статья. Особенно глаз зацепился за следующее
Безопасная платформа — компилируйте и фиксите ошибки прямо во время написания кода.

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

Кортеж это просто группировка значений и программист для собственного удобства может дать этим значениям имена, причем может дать их даже не всем, например, let a = (a: 1, 2, c:3) (другой вопрос что так лучше не делать), а может и наоборот к именованным переменным по номеру обращаться, так что никакого разделения на два типа по факту нет.
Про безопасность видимо имеется ввиду, что ошибки выявляются на этапе написания/компиляции, а не рантайма.
Ну так много кто выявляет ошибки на этапе компиляции/написания, даже для plain c ворнинги (которые легко превращаются в ошибку через -werror) посыпятся если попытаться, например, в указатель на double прокинуть указатель на int. Правда, я тут слазил в оригинал и там Safer т.е. платформа не «безопасная», а просто «безопаснее» [чем Obj-C] с чем сложно спорить и это косяк перевода
В каких случаях использовать класс, а в каких — структуру?

Apple
И еще на какой то сессии WWDC не согласились с популярным мнением, что struct для простых абстракций
Эх, были бы у меня такие вопросы на всех собеседованиях, давно бы в Facebook работал
UFO just landed and posted this here
Прекрасно!
Что бы пройти тестирование — надо зарегистрироваться, оставить свою почту, так сказать.
А потом оказывается, что надо ещё и оставить свой номер телефона.
Не мог не зарегистрироваться ради разъяснений. inout не равно передаче по ссылке. Это заблуждение пошло людям с сишным бэкграундом. В си передача по ссылке изменила бы исходный объект. В Свифте inout не изменит объект до выхода из функции, а просто перезапишет при передаче управления. В официальном же учебнике про это в гонках памяти рассказано.
Меня заинтересовал ваш комментарий и я решил проверить, накидал в плейграунде вот такой пример:
import Foundation

let sem1 = DispatchSemaphore(value: 0)
let sem2 = DispatchSemaphore(value: 0)

func quad(_ a: inout Int) {
    print("Into function quad")
    a = a * a
    print("Internal a = \(a)")
    sem1.signal()
    sem2.wait()
    print("Return from quad")
}

var a = 2
print("Initial a = ", a)
DispatchQueue.global().async {
    quad(&a)
}
sem1.wait()
print("After sem1 signal a = ", a)
sem2.signal()
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
    print("Final a = ", a)
}

Вывод:
Initial a =  2
Into function quad
Internal a = 4
After sem1 signal a =  4
Return from quad
Final a =  4

Как видите, строка «After sem1 signal a = 4» выводится до выхода из функции quad, но тем не менее там a уже равно 4. Либо я вас не правильно понял, либо же вы что-то не то написали
Поизучаю этот вопрос на досуге. Интересные дела)
Могу еще добавить что я пробовал и менять переменную снаружи пока функция висела на семафоре, тоже сработало в обе стороны
Sign up to leave a comment.