Size: a a a

2021 March 04

М

Максим in SwiftBook
Спасибо
источник

YP

Yuriy P in SwiftBook
Приветствую. Вопрос по In-App Purchase. Может ли кто-то подсказать, как обрабатывать ошибки транзакций SKPaymentTransaction? Ибо SKPaymentTransaction.error имеет тип "Error?" , и как например отличить ошибку соединения от нажатия юзером кнопки Cancel при покупке? В документации Apple говорится про тип SKError, который имеет прям кучу вариантов ошибок, только где он используется - я ума не приложу
источник

K

KurKing in SwiftBook
Damir L
Ну ладно, спасибо)
Я посмотрел там вообще интересно, они сначала текстовую всю инфу подгружают, а потом и карантинку
источник

DL

Damir L in SwiftBook
KurKing
Я посмотрел там вообще интересно, они сначала текстовую всю инфу подгружают, а потом и карантинку
Ну я сделал просто через отмену датаТаска, теперь надо сделать кеш)
источник

Д

Дмитрий in SwiftBook
Damir L
Ну я сделал просто через отмену датаТаска, теперь надо сделать кеш)
Можно использовать nuke. Там и автоматическая прогрузка, и кеш
источник

DL

Damir L in SwiftBook
Да, знаю, но пока учусь и хотелось бы понять что как работает и как вообще делать хотя бы базовые вещи)
источник

EG

Eugene G in SwiftBook
Максим
Ребят, подскажите, в чем преимущества структуры от класса и как часто она используется?
Структуры имеют ряд преимуществ перед классами.
1. Они передаются в функции по значению, тем самым обеспечена защита их данных от изменения после выхода из функции.
2. У структур всегда имеется «бесплатный» встроенный инициализатор, не требуется обязательно для них метод init.
3. Если структура подписана на протоколы Equatable и/или Hashable, то Swift может сам для неё синтезировать реализации этих протоколов. Это дополнительно облегчает жизнь программиста. :)
4. Про невозможность наследования от структур уже говорили.
источник

ㅤㅤㅤ in SwiftBook
Переслано от ㅤㅤㅤ
подскажите что надо дописать чтоб мок был правильным
источник

OL

Olga Lidman in SwiftBook
Тип просит указать и опционалом сделать переменную или инициализатор написать
источник

IF

Ilia Fedorov in SwiftBook
Максим
Ну просто я сейчас прохожу лекцию. И тут приводят аргумент, что преимущества структуры заключается в том, что она не наследуется и соответсвенно не перенимает лишние методы и свойства. Но класс же тоже можно не наследовать и просто написать новый
не то, чтобы можно думать о классах или структурах в категориях "лучше" или "хуже". Они просто разные и каждый тип хорош для своей задачи

Еще можно добавить такое понятие как value-type семантика (гуглится)
- можно управлять мутабельностью через var/let,
- а значит можно получить гарантии, что значение не будет изменено из вне (ценное свойство для структур с данными)

Храняться еще структуры (value-type) на стеке, а классы (reference type) в куче. Получение значения и стека работает быстрей, потому что в стеке все значения рядышком в памяти храняться (+ оптимизации на ядре), а в куче они рандомно в памяти разбрасоны и процессор не может применить никакие оптимизация для скорого доступа к объектам в куче.

Еще можно про скорость поговорить. При работе с классами Swift'у приходиться менеджить жизненый цикл value (считать ссылки на объект, деструктить его, если reference counter стал равен 0) и занимать выделением памяти.
- и вроде операция инкремента счетчика ссылов не супер затратная, но их прям оч много надо делать (гуглить reference counting overhead и retain/release overhead)
- к тому же оперцию подсчета ссылок на объект надо синкронизировать между разными потоками, что делает ее еще более медленной

И еще про скорость. Есть такая тема Method Dispatch (лучше найти сессию на WWDC). Это тема про то, как определить какую реализацию метода вообще надо выполнить при вызове функции Foo(). У класса то есть наследование и функции можно переопределять. И если у тебя массив cars: [Vehicle], но в нем лежат лежат объекты классов Bus, Plane, Bicycle, то когда ты будешь в цикле по элементам массива пробегать и вызывать функцию Foo() у каждого (которая может переопределена, а может и нет), то по факту Свифт не знает какую реализацию выполнить. И ему приходиться в рантайме определять, что нужно выполнить — а это долго. Со структура проще — нет наследования, нет и переопределения (если это не протоколы конечно), а значит реализация Foo() находится еще в compile time и в рантайме время на поиск реализации тратить не надо.

И у классов еще, есть такое понятие – identity (часть reference type семантики). Т.е. объекты классов можно сравнить на равенство по указателю (адресу в памяти) -> если адрес совпадает, то эти 2 переменные равны (т.к. это просто 2 разные ссылки, которые указывают на один и тот же объект)

И переменные классов можно менять просто, типа classObject.value = 2. Swift идет по ссылке в кучу и меняет значение. Это свойсто Apple именует indirect storage (еще часть reference type семантики). Со структурой по другому — если меняешь значение у проперти, то создается новая структура и инициализируется сразу с ообновленным значением проперти, и после создания новая структура присваивается в твою переменную.
Звучит наверно долго по времени? Это ж надо копировать, инициализировать....
Но не совсем уж и долго. И чтобы понять почему не долго, надо рассмотреть Array например или String. И Array и String структуры, но вот контент (элементы массива и char'ы соответственно) храняться в куче. Поэтому когда создается копия Array, то под капотом Swift только создает небольшую оболочку для новой структуры Array/String/Data, а контент так и остается в куче лежать и на него новой копии структуры просто ссылка дается
P.s. такая комбинация получается value type и reference type, где от каждого взято только самое лучше))
источник

AM

Al Metall in SwiftBook
Народ тема уже поднималась но все же, кто то брал себе мак на м1? Xcode тянет нормально? Проекты все как работают? 8 гб оперативы вообще как то хватает?
источник

IY

Ivan Yatsenko in SwiftBook
Всем привет, подскажите пожалуйста как округлить дату до целого числа
let calculateDateOfVacation: Int = Int((secondDateDP.date).timeIntervalSince(firstDateDP.date) / 60 / 60 / 24)
           print(calculateDateOfVacation)

сейчас не считае сегодня и завтра выдает = 0
источник

IY

Ivan Yatsenko in SwiftBook
заранее благодарен
источник

Ts

Tim sssssoooooossssk... in SwiftBook
Al Metall
Народ тема уже поднималась но все же, кто то брал себе мак на м1? Xcode тянет нормально? Проекты все как работают? 8 гб оперативы вообще как то хватает?
Этот вопрос раз сто пятьсот спрашивали уже
источник

1

13 in SwiftBook
Ilia Fedorov
не то, чтобы можно думать о классах или структурах в категориях "лучше" или "хуже". Они просто разные и каждый тип хорош для своей задачи

Еще можно добавить такое понятие как value-type семантика (гуглится)
- можно управлять мутабельностью через var/let,
- а значит можно получить гарантии, что значение не будет изменено из вне (ценное свойство для структур с данными)

Храняться еще структуры (value-type) на стеке, а классы (reference type) в куче. Получение значения и стека работает быстрей, потому что в стеке все значения рядышком в памяти храняться (+ оптимизации на ядре), а в куче они рандомно в памяти разбрасоны и процессор не может применить никакие оптимизация для скорого доступа к объектам в куче.

Еще можно про скорость поговорить. При работе с классами Swift'у приходиться менеджить жизненый цикл value (считать ссылки на объект, деструктить его, если reference counter стал равен 0) и занимать выделением памяти.
- и вроде операция инкремента счетчика ссылов не супер затратная, но их прям оч много надо делать (гуглить reference counting overhead и retain/release overhead)
- к тому же оперцию подсчета ссылок на объект надо синкронизировать между разными потоками, что делает ее еще более медленной

И еще про скорость. Есть такая тема Method Dispatch (лучше найти сессию на WWDC). Это тема про то, как определить какую реализацию метода вообще надо выполнить при вызове функции Foo(). У класса то есть наследование и функции можно переопределять. И если у тебя массив cars: [Vehicle], но в нем лежат лежат объекты классов Bus, Plane, Bicycle, то когда ты будешь в цикле по элементам массива пробегать и вызывать функцию Foo() у каждого (которая может переопределена, а может и нет), то по факту Свифт не знает какую реализацию выполнить. И ему приходиться в рантайме определять, что нужно выполнить — а это долго. Со структура проще — нет наследования, нет и переопределения (если это не протоколы конечно), а значит реализация Foo() находится еще в compile time и в рантайме время на поиск реализации тратить не надо.

И у классов еще, есть такое понятие – identity (часть reference type семантики). Т.е. объекты классов можно сравнить на равенство по указателю (адресу в памяти) -> если адрес совпадает, то эти 2 переменные равны (т.к. это просто 2 разные ссылки, которые указывают на один и тот же объект)

И переменные классов можно менять просто, типа classObject.value = 2. Swift идет по ссылке в кучу и меняет значение. Это свойсто Apple именует indirect storage (еще часть reference type семантики). Со структурой по другому — если меняешь значение у проперти, то создается новая структура и инициализируется сразу с ообновленным значением проперти, и после создания новая структура присваивается в твою переменную.
Звучит наверно долго по времени? Это ж надо копировать, инициализировать....
Но не совсем уж и долго. И чтобы понять почему не долго, надо рассмотреть Array например или String. И Array и String структуры, но вот контент (элементы массива и char'ы соответственно) храняться в куче. Поэтому когда создается копия Array, то под капотом Swift только создает небольшую оболочку для новой структуры Array/String/Data, а контент так и остается в куче лежать и на него новой копии структуры просто ссылка дается
P.s. такая комбинация получается value type и reference type, где от каждого взято только самое лучше))
Во-первых, спасибо за развернутое объяснение (хоть и не я спрашивал:))
Во-вторых что гуглить, чтоб подробнее почитать, про тему с тем, что контент многих базовых типов храниться в куче?
источник

s

stolenhen in SwiftBook
Ilia Fedorov
не то, чтобы можно думать о классах или структурах в категориях "лучше" или "хуже". Они просто разные и каждый тип хорош для своей задачи

Еще можно добавить такое понятие как value-type семантика (гуглится)
- можно управлять мутабельностью через var/let,
- а значит можно получить гарантии, что значение не будет изменено из вне (ценное свойство для структур с данными)

Храняться еще структуры (value-type) на стеке, а классы (reference type) в куче. Получение значения и стека работает быстрей, потому что в стеке все значения рядышком в памяти храняться (+ оптимизации на ядре), а в куче они рандомно в памяти разбрасоны и процессор не может применить никакие оптимизация для скорого доступа к объектам в куче.

Еще можно про скорость поговорить. При работе с классами Swift'у приходиться менеджить жизненый цикл value (считать ссылки на объект, деструктить его, если reference counter стал равен 0) и занимать выделением памяти.
- и вроде операция инкремента счетчика ссылов не супер затратная, но их прям оч много надо делать (гуглить reference counting overhead и retain/release overhead)
- к тому же оперцию подсчета ссылок на объект надо синкронизировать между разными потоками, что делает ее еще более медленной

И еще про скорость. Есть такая тема Method Dispatch (лучше найти сессию на WWDC). Это тема про то, как определить какую реализацию метода вообще надо выполнить при вызове функции Foo(). У класса то есть наследование и функции можно переопределять. И если у тебя массив cars: [Vehicle], но в нем лежат лежат объекты классов Bus, Plane, Bicycle, то когда ты будешь в цикле по элементам массива пробегать и вызывать функцию Foo() у каждого (которая может переопределена, а может и нет), то по факту Свифт не знает какую реализацию выполнить. И ему приходиться в рантайме определять, что нужно выполнить — а это долго. Со структура проще — нет наследования, нет и переопределения (если это не протоколы конечно), а значит реализация Foo() находится еще в compile time и в рантайме время на поиск реализации тратить не надо.

И у классов еще, есть такое понятие – identity (часть reference type семантики). Т.е. объекты классов можно сравнить на равенство по указателю (адресу в памяти) -> если адрес совпадает, то эти 2 переменные равны (т.к. это просто 2 разные ссылки, которые указывают на один и тот же объект)

И переменные классов можно менять просто, типа classObject.value = 2. Swift идет по ссылке в кучу и меняет значение. Это свойсто Apple именует indirect storage (еще часть reference type семантики). Со структурой по другому — если меняешь значение у проперти, то создается новая структура и инициализируется сразу с ообновленным значением проперти, и после создания новая структура присваивается в твою переменную.
Звучит наверно долго по времени? Это ж надо копировать, инициализировать....
Но не совсем уж и долго. И чтобы понять почему не долго, надо рассмотреть Array например или String. И Array и String структуры, но вот контент (элементы массива и char'ы соответственно) храняться в куче. Поэтому когда создается копия Array, то под капотом Swift только создает небольшую оболочку для новой структуры Array/String/Data, а контент так и остается в куче лежать и на него новой копии структуры просто ссылка дается
P.s. такая комбинация получается value type и reference type, где от каждого взято только самое лучше))
Респект, нормально инфы выкатил)
источник

🅰Б

🅰️лександр Б.... in SwiftBook
Yuriy P
Приветствую. Вопрос по In-App Purchase. Может ли кто-то подсказать, как обрабатывать ошибки транзакций SKPaymentTransaction? Ибо SKPaymentTransaction.error имеет тип "Error?" , и как например отличить ошибку соединения от нажатия юзером кнопки Cancel при покупке? В документации Apple говорится про тип SKError, который имеет прям кучу вариантов ошибок, только где он используется - я ума не приложу
источник

🅰Б

🅰️лександр Б.... in SwiftBook
Ivan Yatsenko
Всем привет, подскажите пожалуйста как округлить дату до целого числа
let calculateDateOfVacation: Int = Int((secondDateDP.date).timeIntervalSince(firstDateDP.date) / 60 / 60 / 24)
           print(calculateDateOfVacation)

сейчас не считае сегодня и завтра выдает = 0
В каком смысле до целого числа округлить?
источник

🅰Б

🅰️лександр Б.... in SwiftBook
Ivan Yatsenko
Всем привет, подскажите пожалуйста как округлить дату до целого числа
let calculateDateOfVacation: Int = Int((secondDateDP.date).timeIntervalSince(firstDateDP.date) / 60 / 60 / 24)
           print(calculateDateOfVacation)

сейчас не считае сегодня и завтра выдает = 0
Возможно так - let calculateDateOfVacation = Int((Date()).timeIntervalSince1970 / 60 / 60 / 24)

Вместо Date() - свою дату подставляй
источник

🅰Б

🅰️лександр Б.... in SwiftBook
🅰️лександр Б.
Возможно так - let calculateDateOfVacation = Int((Date()).timeIntervalSince1970 / 60 / 60 / 24)

Вместо Date() - свою дату подставляй
А вообще время добавляй лучше через календарь
источник