1. нет приведения response к HTTPURLResponse с соответствующей проверкой на валидность
2. коды должны быть в диапазоне от 200 до 299. а не IsSuccessStatusCode
Он полностью ему соответсвует. То, что Swift не осилил внятный API для HTTP-клиента, это проблема криворукости его разработчиков. Там вообще весь Foundation это яркий пример того, как делать не надо. Чтение и запись файлов я показывал, да.
Здравствуйте, Mamut, Вы писали:
Z>>он не соответствует исходному примеру.
M>Он полностью ему соответсвует. То, что Swift не осилил внятный API для HTTP-клиента, это проблема криворукости его разработчиков. Там вообще весь Foundation это яркий пример того, как делать не надо. Чтение и запись файлов я показывал, да.
причем тут hhtpClient? где ты его в примере вообще увидел? у тебя есть response непонятного типа, который должен быть приведен к HTTPURLResponse + проведена проверка. откуда ты знаешь, как ты вообще этот response получил? это может быть параметр в функции типа AnyObject.
ну и проверку кодов на требуемый диапазон ты тоже упустил. есть конкретные значения, каким боком ты здесь IsSuccess приплел?
Z>причем тут hhtpClient? где ты его в примере вообще увидел?
Да ты что, response, приводимый к типу HTTPURLResponse и проверяемый на успешный status code вообще никакого отношения ни к HTTP ни к клиентам не имеет, ты что.
Z> у тебя есть response непонятного типа, который должен быть приведен к HTTPURLResponse + проведена проверка. откуда ты знаешь, как ты вообще этот response получил? это может быть параметр в функции типа AnyObject.
ага. какой-то сферовакуумный код, в котором неизвестно откуда взявшийся response внезапно надо срочно привести к HTTPURLResponse. Нет конечно. Все это — результат убогого до невозможности API Свифта (что ты там ныл про отсутсвие «нормальных асинхронных HTTP API в Андроиде»?)
// начало вызова комменти ровать не будем,
// отсылка JSON'а немного писец во всех языках
let request = ...;
let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
// в этом говне переменные могут быть nil,
// а проверить на nil через if x == nil в общем случае нельзя.
// только присваиванием
// потому что == требует наличия Equatable у любого объекта
// компилятор решить эту проблему не может, видать.
// Но говно с точки зрения зверюги — это почему-то C# и Java, а не Swiftif let error = error {
return
}
// жрем еще говна прекрасным дизайном API
// потому что согласно зверюге, в красивом API ответ от
// хттп-клиента может быть чем угодно, например, AnyObject
// а работать с этим прекрасным асинхронным API надо вприсядку,
// выполняя все действия вручную
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
return
}
// почему так? Потому что убогое убожество Swift
// неспособно привести одно к другому, а из него достать третье
// у response тип URLResponse? поэтому надо привести к HTTPURLResponse? через as?
// а через что же еще. Больше! Больше доп. синтаксиса! Это не как в C#/Java, это другое
// тут все кривые расширения и добавления синтаксиса, согласно зверюге, это благо
// и программисты все поймут
//
// Но достать из результата приведения value не получится, потому что ? — это скрытый Optional
// и надо его сначала "unwrap" через ! (аналог .get() в Java)
// и результат тоже Optional. Его тоже надо распаковать!
token = (response as? HTTPURLResponse)!.value(forHTTPHeaderField: "x-set-authentication")!
})
теперь сравним это с абсолютно аналогичным кодом на C#
var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
if (response.IsSuccessStatusCode) {
// единственный неочевидный момент
// для кастомных заголовков надо вытягивать их вручную
// вместо First можно или FirstOrDefault() для обработки случая,
// если заголовка нет
httpResponseMessage.Headers.GetValues("x-set-authentication").First();
}
Здравствуйте, zverjuga, Вы писали:
Z>Здравствуйте, Mamut, Вы писали:
Z>причем тут? где ты его в примере вообще увидел? откуда ты знаешь, как ты вообще получил? Z>ну и ты тоже упустил.
Неразумно спорить о мелких деталях синтаксиса.
Можешь хотя бы в нескольких пунктах сформулировать, чем свифт лучше? Ну, например, шарп лучше некоторого условного языка Х тем, что
есть async/await и не надо колбеки с конечными автоматами руками писать
есть линк и можно писать типизированные запросы ко внешним источникам данных, в частности к реляционным БД
есть возможность обобщенно и безопасно работать с областями памяти разного типа — на стеке и т.д., что дает возможность перфоманс оптимизировать
Z>ну и проверку кодов на требуемый диапазон ты тоже упустил. есть конкретные значения, каким боком ты здесь IsSuccess приплел? IsSuccessStatusCode как раз и выполняет проверку на то, что код в диапазоне 200..299
M>ага. какой-то сферовакуумный код, в котором неизвестно откуда взявшийся response внезапно надо срочно привести к HTTPURLResponse. Нет конечно. Все это — результат убогого до невозможности API Свифта (что ты там ныл про отсутсвие «нормальных асинхронных HTTP API в Андроиде»?)
Но тут ты сам взял вбросил какой-то говнокод и на его основе начал хаять язык.
К тому же ты зачем-то обсуждаешь API операционки, а пытаешься создать вид, что проблема в языке
M> // а проверить на nil через if x == nil в общем случае нельзя. M> if let error = error {
чушь и неправда
M> // жрем еще говна прекрасным дизайном API M> // потому что согласно зверюге, в красивом API ответ от M> // хттп-клиента может быть чем угодно, например, AnyObject
бред. речь шла о языке, ты нафига-то притянул сюда API операционки. есть нормальные библиотеки, в стиле swift
M> // почему так? Потому что убогое убожество Swift M> // неспособно привести одно к другому, а из него достать третье M> // у response тип URLResponse? поэтому надо привести к HTTPURLResponse? через as? M> // а через что же еще. Больше! Больше доп. синтаксиса! Это не как в C#/Java, это другое
больше демагогии и говнокода в качестве примера дерьмовости языка
M> // и надо его сначала "unwrap" через ! (аналог .get() в Java) M> // и результат тоже Optional. Его тоже надо распаковать!
нет, просто надо нормально писать код. у меня в проектах линтер настроен на блокировку force unwrapping, и совершенно не портит жизнь.
Z>кстати, отличный пример. попробуешь переписать подобное в сишарпе?
Какие-то непонятки с типами as?. Глобальные переменные "DispatchQueue.main". И непонятно кто такой self.
На java будет что-то типа
if (!response.isSuccessful()) {
//послать сообщение в очередь? Или я не понял что там делается?
queue.add(new AuthenticationDidFail (true));
}
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, IID, Вы писали:
IID>1) Флагманы андроидные не сильно дешевле, а иногда и дороже.
А какая разница девелоперу под ведроид сколько стоит флагман? Его интересует платежеспособность аудитории, для которой он пишет.
IID>А самое главное — какая корреляция между бюджетностью телефона и его отдачей ? IID>Правильно, никакой.
Прямая. Какие аппы там будут хорошо работать а какие не потянет. Ну и в целом платежеспособность/готовность покупать у людей с бюджетными моделями как правило ниже.
IID>Славно пригорело.
Это просто ты не понимаешь о чём рассуждаешь.
IID>Речь о рыночной доле телефонов. И да — доля эпла только снижается.
Пофигу. Интересует денежный выхлоп этой доли.
IID>Причём тут доходы мобильных приложений?
Это доходы разработчиков приложений.
IID>Когда эплобою возразить хочется, но нечем, он начинает хвастаться как качественно его умеют доить.
Пригорает?
У меня всю жизнь ведроид межжупрочим
Здравствуйте, Flem1234, Вы писали:
F>Можешь хотя бы в нескольких пунктах сформулировать, чем свифт лучше? Ну, например, шарп лучше некоторого условного языка X F>А что может свифт?
пример выше показал то, что умеет делать свифт. и делает он следующие вещи
1. приводит объект из одного типа в другой с проверкой
2. поиск совпадения из заданного диапазона
3. вызов кода в главном потоке
если абстрагироваться от конкретных типов и классов, то переписанный пример на свифте будет следующим
var foo = someObject as ConcreteClass;
var array = Enumerable.Range(200, 299).ToArray();
if (foo == null || !array.Contains(foo.someValue)) {
// запустить в главном потоке код
// self.authenticationDidFail = true
}
то есть, конструкция
guard let foo = ...
в данном примере одновременно объединяет в себе и приведение типов и проверку на нуль. в данном пример + еще и проверку на совпадение в заданном диапазоне. и если любое из двух условий не было выполнено, то выполняется блок else, где из главного потока вызвается
self.authenticationDidFail = true
опять так, сравниваем синтаксис создания списка по заданному диапазону в свифте
(200...299)
против сишарпа
Enumerable.Range(200, 299)
я уже и не помню, как в сишарпе одной строкой запустить код в главном потоке, потому опустил эту часть.
и это только одна конкретная мелочь, коих в свифте, конечно же, можно привести полно. когда проект большой, то таких мелочей вагон и ты начинаешь чувствовать их мощь и удобство. потому каждый раз говорить одно и то же реально задолбало.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, TimurSPB, Вы писали:
S>>>В последнее время выстрелили мобильные предложения. А там рулит Ява. TSP>>В геймдеве популярен Unity. А там C#
CC>Для сравнительно небольших проектов. Потом упираются в ресурсы.
Здравствуйте, zverjuga, Вы писали:
Z>переписанный код на сишарпе будет таким
Z>var foo = someObject as ConcreteClass; Z>var array = Enumerable.Range(200, 299).ToArray();
Зачем тут .ToArray()?
Z>if (foo == null || !array.Contains(foo.someValue)) { Z> // запустить в главном потоке код
А в каком он по твоему запустится?
Z> // self.authenticationDidFail = true Z>}
Z>я уже и не помню, как в сишарпе одной строкой запустить код в главном потоке, потому опустил эту часть.
Так может сначала нужно разобраться в критикуемом?
Z>и это только одна конкретная мелочь, коих в свифте, конечно же, можно привести полно. когда проект большой, то таких мелочей вагон и ты начинаешь чувствовать их мощь и удобство. потому каждый раз говорить одно и то же реально задолбало.
Пока не видно никакой пользы, а создавать вручную диапазон HTTP Codes для проверки на Success и кичиться этим — это от большого ума (нет).
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Klikujiskaaan, Вы писали:
K>>Какие проекты сравнительно небольшие?
CC>https://unity3d.com/games-made-with-unity
Battletech и Escape from Tarkov — это небольшие проекты?