• Можно ли написать бэкенд на Java а фронтенд на Swift для Apple?

    Backend можно написать на чем угодно. Java тоже подойдет.

    Будет ли это работать на Apple ?

    Даже не сомневайтесь. Вообще все равно что крутится на фронте, будь то приложение на swift или react native или js фреймворк для веб-приложения и т.д.
    Ответ написан
  • InnoDB vs MyISAM, что выбрать?

    @carryx
    MySQL Developer
    InnoBd быстрее на выборку
    MyIsam на вставку
    в остальном отличие описали выше
    Ответ написан
  • Стоит ли начинать изучать разработку под iOS с нуля в 36 лет?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Стоит ли начинать изучать разработку под iOS с нуля в 36 лет?

    Если нравится, и мотивацией служат не только деньги - то да.

    и работать на фриланс

    Как по мне - плохая идея, и именно она может послужить камнем преткновения в вашей диллеме. Джуны не фрилансе = слабые в архитектуре(не хватает знаний), под рукой нет человека который будет тыкать носом на проблемные места(в офисе как раз такого за глаза).

    3. Реально ли начинающему самоучке найти работу на удалёнке?

    Зависит от ваших мозгов, если готовы уделять программированию с нуля по 5-6 часов в день, в течении года - может что нибудь получится. Но без code review - есть шанс что выучитесь так себе, а переучивать программиста - довольно дорого.

    С какими трудностями я могу столкнуться? (возраст, недоверие, стереотипы, конкуренция и т.д.)

    Возраст - на фрилансе без разницы сколько вам лет, главное прокачанное портфолио, например на Upwork.
    Недоверие - 100% пока вы новичок на фрилансе, будете сражаться с другими за копейки.
    Конкуренция - на уровне джуна - колоссальная, скорее всего вас съедят молодые, и голодные студенты, которые как раз и нашли позицию джуна в офисе, и уже качаются на 2 стороны.

    Моё субъективное мнение: изначально неправильно выбрана стратегия.
    Фриланс + джун = самый верный вариант здесь подошел бы php какой нибудь, и создание сайтов на колене. И как только у вас появились знания какого нибудь языка и общего построения архитектуры проекта. Можно учить уже swift. 2 языка в голове = это уже норма для программиста

    UPD: Если всё такие горят глаза, подойдет более дорогой вариант. Находите ментора после изучения базы языка (желательно работающий програмист на позиции Senior+), который будет делать code review и помогать. Это позволит эмулировать "офис", и дальше искать не фриланс, а удаленку по европе\снг.
    Ответ написан
  • Как можно установить приложение на iOS из Xcode?

    NSA-bot
    @NSA-bot
    Непонятно, в чем у вас возникает проблема. Подключаете айфон к макбуку, выбираете в икскоде вместо симулятора свой айфон и так же как обычно запускаете компиляцию. Всё, калькулятор на айфоне и можете начать калькулировать.

    Если аккаунт разработчика непроплаченный, то приложение проживет на айфоне дней 5 вроде, а потом начнет вылетать и нужно опять подключать айфон и компилировать и так каждые пять дней. Если аккаунт разработчика оплачен, тогда никаких проблем вообще возникать не должно. А какие у вас возникают проблемы?
    Ответ написан
  • Swift. При формировании массива добавляется __lldb_expr что это значит?

    @402d
    начинал с бейсика на УКНЦ в 1988
    Переменная экземпляр класса. print пытается напечатать вашу переменную .
    Хочет от этого экземпляра взять строковое представление.
    Такого метода у класса нет. По дефолту печатает имя класса экземпляром, которого является переменная.
    Ответ написан
  • Как обновить данные во ViewController'е после dismiss() во всплывающем?

    varabeis
    @varabeis
    iOS разработчик, канал https://t.me/sparrowcode
    Тру вей использовать делегаты.

    Можете попробовать закостылять через parent и приведение типа. Не рекомендую.
    Ответ написан
  • Как вывести правильный NSRange с NSAttributedString если NSAttributedString инициализирован с Data(HTML)?

    @tiger_13 Автор вопроса
    Как вариант - использовать regex, с помощью которого найти что написано в <p>из отображаемого текста (ищем в String, инициализированным с data(html), то есть видим все теги), и искать этот текст в attributed.string:
    //1
        private func getRangeFor(attributedString:String,aValue:String) -> NSRange?{
            guard let aWord = self.findAWords(aValue: aValue),let foundRange = attributedString.range(of: aWord) else {return nil}//ищем aWord - то, что записано в <p>, затем ищем уже range в attributedString(отрендеренный HTML)
            return NSRange(foundRange, in: attributedString)
        }
        
        //2
        private func findAWords(aValue:String) -> String?{
            guard let data = self.HTMLdata,let str = String(data: data, encoding: .utf8) else {return nil}
            
            
            let pattern = #"<p class=main-text><a name="\#(aValue)"></a>\n<span class=main-text-span>(?<paragraph>.+)</span>"#
            let regexRange = NSRange(location: 0, length: str.utf16.count)
            let regex = try! NSRegularExpression(pattern: pattern)
            let regexResult = regex.firstMatch(in: str, options: [], range: regexRange)
            guard let matchedWordRange = regexResult?.range(withName: "paragraph"), let wordRange = Range(matchedWordRange, in: str) else {return nil}
            return String(str[wordRange]) //вернет слово (Название), нужно дописать regex, чтобы была вторая группа - слово ( абзаца)
        }
    Ответ написан
  • Как передать данные между 2-мя отдалёнными VC?

    varabeis
    @varabeis
    iOS разработчик, канал https://t.me/sparrowcode
    Скорее всего вам нужно использовать или UserDefaults или базу данных. Зависит от данных и задачи.
    Ответ написан
  • Для чего нужен AppDelegate?

    doublench21
    @doublench21 Куратор тега Swift
    t.me/jeudesprits
    Вообще говоря это некая точка входа в ваше приложение. Этот класс управляет состояниями вашего приложения. Он так же содержит главное окно вашего приложения, то бишь UIWindow. В этом классе настраиваются все основные потребности вашего приложения, будь то Push Notifications или Voice Calls и так далее. Я бы сказал это Core вашего приложения.

    Это можно понять по его наследованию. UIResponder и UIApplicationDelegate
    По первому:
    An abstract interface for responding to and handling events.

    По второму:
    A set of methods that are called by the singleton UIApplication object in response to important events in the lifetime of your app.

    То бишь чувствуете насколько тут важные(core) вещи вашего приложения.

    Но на начальном этапе изучения он вам практически не понадобится.
    Ответ написан
  • Как закрыть UIAlertController?

    Loriens
    @Loriens
    iOS Developer
    Перемести appDelegate.getApiService(...).getRequests(...) во viewDidAppear. Present view controller'a не должен вызываться во viewDidLoad.

    Нашёл здесь - ответ на StackOverflow
    Ответ написан
  • Как сделать прокрутку как в TableView но горизонтальную?

    varabeis
    @varabeis
    iOS разработчик, канал https://t.me/sparrowcode
    Вам нужно использовать не таблицу, а UICollectionView. Подробнее на сайте эпл.

    Размеры ячейки определяются лейаутом, это объект класса UICollectionViewLayout. Если хотите скейлить ячейки к центру, так же настраивается в лейауте. Система переиспользования аналогична таблице.
    Ответ написан
  • Как спарить сложные данные JSON?

    doublench21
    @doublench21 Куратор тега Swift
    t.me/jeudesprits
    У вас JSON кривой по ссылке. В этой строчке
    {"id":67,"iconImage":"image\/catalog\/style\/modile\/icons-03.png"
    id имеет целочисленный тип, хотя во всех остальных местах это строка.
    5dd182bfe2d36713711596.jpeg

    Если не учитывать этот косяк в JSON, то такое можно спарсить как-то так:
    5dd181e2cd959773181456.png

    Код
    struct EntryList: Decodable {
      struct DynamicCodingKey: CodingKey {
        var stringValue: String
        init?(stringValue: String) { self.stringValue = stringValue }
        var intValue: Int? { nil }
        init?(intValue: Int) { nil }
      }
    
      struct Entry: Decodable {
        struct Content: Decodable {
          struct Subcategory: Decodable {
            let id: String
            let iconImage: String
            let name: String
            let sortOrder: String
            let type: String
          }
          
          let iconImage: String
          let iconImageActive: String
          let image: String
          let name: String
          let sortOrder: String
          let subcategories: [Subcategory]
        }
        
        let name: String
        let content: Content
      }
     
      let entries: [Entry]
      
      init(from decoder: Decoder) throws {
        let entriesContainer = try decoder.container(keyedBy: DynamicCodingKey.self)
        
        entries = try entriesContainer.allKeys.map { key in
          print(key)
          let content = try entriesContainer.decode(Entry.Content.self, forKey: key)
          return Entry(name: key.stringValue, content: content)
        }
      }
    }
    
    var entryList: EntryList?
    
    let task = URLSession
      .shared
      .dataTask(with: URL(string: "https://blackstarshop.ru/index.php?route=api/v1/categories")!) { (data, _, error) in
        guard error == nil else { return }
        guard let data = data else { return }
        
        entryList = try! JSONDecoder().decode(EntryList.self, from: data)
      }
    
    task.resume()
    Ответ написан
  • Appstore app rejection iOS 13.2.2?

    chiliec
    @chiliec
    iOS-разработчик
    В идеале попробовать самому запустить на девайсе, симулятор всё же отличается по поведению.
    Ответ написан
  • Swift Фибона́ччи в чем ошибка?

    0xD34F
    @0xD34F
    fibbonachi(n[0],left+n[1])

    Да ну? Первым слагаемым следующего значения должно быть второе слагаемое предыдущего:

    fibbonachi(n[1], left + n[1])
    Ответ написан
  • Как в функции с помощью Switch перевести массив из Int -> String?

    varabeis
    @varabeis
    iOS разработчик, канал https://t.me/sparrowcode
    Что делает строчка:
    let array = [1...9]

    Не понял про перевод в массив. В примере кода вы просто выводите значения. Если я неправильно понял ваш вопрос - уточните.
    Но неважно, давайте перейдем к костылям.

    Делаем через функцию:
    func switchUp(_ value: Int) -> String? {
            guard value > 0 && value < 10 else { return nil }
            switch value {
            case 1:
                return "Один"
            case 2:
                return "Два"
            default:
                return nil
            }
    }


    Другой вариант костыля:

    enum LocalizedValue: String {
            case 1 = "Один"
            case 2 = "Два"
            case 3 = "Три"
    }
        
    let string = LocalizedValue.1.rawValue


    Если не забывать про локализацию, можно сломать голову (род существительных, число и прочее). Но как я понимаю, вам не для локализации, а для разового эксперимента. Костыли подойдут.

    P.S. Используйте форматирование для кода.
    Ответ написан
  • Зачем нужен Optional и почему над null нельзя выполнить те же действия?

    doublench21
    @doublench21
    t.me/jeudesprits
    Концепция опционалов не нова и проста как банный лист. Это всего лишь перечисление(enum):
    (Полную реализацию можно глянуть тут)

    enum Optional<Wrapped>: ExpressibleByNilLiteral {
      // The compiler has special knowledge of Optional<Wrapped>, including the fact
      // that it is an `enum` with cases named `none` and `some`.
      /// The absence of a value.
      ///
      /// In code, the absence of a value is typically written using the `nil`
      /// literal rather than the explicit `.none` enumeration case.
      case none
    
      /// The presence of a value, stored as `Wrapped`.
      case some(Wrapped)
    
      /// Creates an instance that stores the given value.
      @_transparent
      public init(_ some: Wrapped) { self = .some(some) }
    
     //...


    НО люди по своей природе не любят сложностей, даже если сама идея достаточно хорошо. Никто не хочет каждый раз писать Optional<MyClass>.some(myObj) и тому сопутствующее...

    Тут та и на сцену выходит язык Swift, где концепция Опционалов выведена в абсолют и поддерживается на уровня компилятора. А что же это даёт? Достаточно много удобств: не нужно писать полный тип, добавили соответсвующие литералы("!", "?", "nil") и в целом работа с перечислением(enum Optional) сделана в виде обычного стандартного типа, Аля Int какой-нибудь.

    ---------------------------------------

    Зачем нужен Optional и почему над null нельзя...?

    Нельзя потому-что по своей природе null указывает на указатель который никуда не указывает в данный момент. Optional же позволяет растянуть эту концепцию не только на указатели(значит на ссылочные типы), но и на самые обычные типы(типы значения).
    Ответ написан
  • Как обновить интерфейс при нажатии кнопки(проблема с потоками)?

    doublench21
    @doublench21 Куратор тега Swift
    t.me/jeudesprits
    Остановку индикатора нужно делать по завершению работы. Работа с URLSession является асинхронной, поэтому останавливать индикатор нужно в completion таска, который вы запускаете.

    Все примеры показанные вами можно просто выкинуть. Это полнейший ужас.

    Нельзя пользователю запрещать что-то делать. По крайне мере он должен иметь возможность переключаться между табами, если они есть.

    Если вы хотите показать пользователю, что идет загрузка, то сделайте оверлай, который будет показываться во время работы таска и скроется по его окончанию. Примеров миллион. Первый из гугла:
    https://stackoverflow.com/questions/27960556/loadi...

    UPD:
    5dbaf3a561387056015331.png

    Текстом
    class ViewController: UIViewController {
      
      @IBOutlet var button: UIButton!
      
      
      var alert: UIAlertController?
      
      func displayActivityIndicatorAlert() {
        alert = UIAlertController(title: "Deleting from black list...", message: nil, preferredStyle: .alert)
        let activityIndicator = UIActivityIndicatorView(style: .medium)
        activityIndicator.translatesAutoresizingMaskIntoConstraints = false
        activityIndicator.isUserInteractionEnabled = false
        activityIndicator.startAnimating()
        
        alert!.view.addSubview(activityIndicator)
        alert!.view.heightAnchor.constraint(equalToConstant: 95).isActive = true
        
        activityIndicator.centerXAnchor.constraint(equalTo: alert!.view.centerXAnchor, constant: 0).isActive = true
        activityIndicator.bottomAnchor.constraint(equalTo: alert!.view.bottomAnchor, constant: -20).isActive = true
        
        present(alert!, animated: true)
      }
      
      func dismissActivityIndicatorAlert() {
        alert?.dismiss(animated: true)
        alert = nil
      }
      
      var blackList = [Int](0...9)
      let lock = NSLock()
      
      func asyncDeleteBlackList() {
        var tasks = [URLSessionTask]()
        tasks.reserveCapacity(10)
        
        var results = [Int: String]()
        results.reserveCapacity(10)
        
        let group = DispatchGroup()
        
        displayActivityIndicatorAlert()
        
        for item in blackList {
          group.enter()
          
          let url = URL(string: "https://.../api/v1/today/batch")!
          let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
              // Что-то делаем с ошибкой на клиенте...
              return
            }
            
            guard let httpResponse = response as? HTTPURLResponse,
              (200...299).contains(httpResponse.statusCode) else
            {
              // Что-то делаем с ошибкой на сервере...
              return
            }
            
            if let mimeType = httpResponse.mimeType,
              mimeType == "application/json",
              let data = data,
              let string = String(data: data, encoding: .utf8)
            {
              print("Запрос №\(item) завершён.")
              self.lock.lock()
              results[item] = string
              self.lock.unlock()
              group.leave()
            }
          }
          
          tasks.append(task)
          task.resume()
        }
        
        group.notify(queue: .main) {
          print("\nЗадача завершена.")
          self.dismissActivityIndicatorAlert()
        }
      }
      
      override func viewDidLoad() {
        button.addTarget(self, action: #selector(pressed(sender:)), for: .touchUpInside)
      }
      
      @objc
      func pressed(sender: UIButton) {
        asyncDeleteBlackList()
      }
    }


    Результат: (Видео)
    https://disk.yandex.ru/i/S5yG9YQsRRJSZg
    Ответ написан
  • Важно ли количество озу для программирования под IOS?

    lamer350
    @lamer350
    กำลังสูงสุด
    4Гб не то что мало для программирования, ее мало уже просто для повседневного использования...
    Ответ написан