• Как передать данные между 2-мя отдалёнными VC?

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

    doublench21
    @doublench21 Куратор тега Swift
    Вообще говоря это некая точка входа в ваше приложение. Этот класс управляет состояниями вашего приложения. Он так же содержит главное окно вашего приложения, то бишь 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) вещи вашего приложения.

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

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

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

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

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

    doublench21
    @doublench21 Куратор тега Swift
    У вас 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()
    Ответ написан
    2 комментария
  • Appstore app rejection iOS 13.2.2?

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

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

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

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

    ivanvorobei
    @ivanvorobei
    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. Используйте форматирование для кода.
    Ответ написан
    1 комментарий
  • Зачем нужен Optional и почему над null нельзя выполнить те же действия?

    doublench21
    @doublench21
    Концепция опционалов не нова и проста как банный лист. Это всего лишь перечисление(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
    Остановку индикатора нужно делать по завершению работы. Работа с 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Гб не то что мало для программирования, ее мало уже просто для повседневного использования...
    Ответ написан
    5 комментариев
  • Ответ apple при отправке в AppStore: We noticed that several screens of your app were laid out in a way that made it difficult to use your app?

    @alfari0n
    Надо немного изменить UX интерфейс. Тебе написали,что слишком все сгруппировано. Помести кнопку ниже,ее не получится нажать, держа телефон оджной рукой,придется перехватывать телефон двуми руками. Смести все ближе к середине и кнопку входа поставь ниже. Смотри картинку как пример: 5d8b5848c4fca754446861.png
    Ответ написан
    Комментировать
  • Как грамотно реализовать задачу(описание ниже)?

    doublench21
    @doublench21 Куратор тега Swift
    Странный у вас выбор тегов и способ решения.

    Это называется балансировкой нагрузки и такие задачи должен решать 4-ый сервер, который будет следить за нагрузкой 3-х остальных. Это задача нисколько не про клиент, ибо клиенту доверять нельзя, да и не решаются такие задачи на клиенте, данных мало.

    Балансировка видео потоков это вообще тема для отдельного разговора. Вам лучше не изобретать велосипед, а использовать готовые балансировщикии нагрузки.
    Ответ написан
    Комментировать
  • Как из SAMSUNG сделать IPhone?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    iOS - проприетарный. Его не существует ни open source, ни под любые не яблочные архитектуры. Это в принципе невозможно сделать
    Ответ написан
    Комментировать
  • IOS разработка, какой mac выбрать?

    Zoominger
    @Zoominger
    System Integrator
    Хочу найти дешевый и сердитый вариант.

    Так не бывает с Apple, там только дорого, но здорово.

    Подходит ли Mac mini для разработки?

    Да, подходит, вы же не 3D-игры будете писать на своём движке.

    Можете даже Эйр взять, он относительно недорогой, если для мобильной разработки, то вполне потянет.
    Ответ написан
    2 комментария
  • Создание Андроид приложений?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Unity + C#, вполне кроссплатформ. А для чайников - это в столовую, пирожки лепить. Все что относится к разработке требует подхода чуть сложнее чем в тетрис поиграть.
    Ответ написан
    Комментировать
  • Создание Андроид приложений?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Android Studio для Андроид.
    XCode - для iOS.
    В виде конструктора ничего нет
    Ответ написан
    Комментировать
  • Запустить мое приложение программно в IOS, swift?

    doublench21
    @doublench21 Куратор тега Swift
    Будильник ты никогда не создашь! В iOS неактивное приложение, остаётся неактивным. Аналог системного будильника не сделать.

    А чтобы не страдать херней и сделать что-то подобное, можно и нужно использовать Shortcuts.
    Ответ написан
    Комментировать
  • Информация о том, кто считывает QR код, возможно ли?

    Ahen
    @Ahen
    Универсальный дилетант
    Добавлять какой-то параметр в ссылку, при наличии параметра на стороне сервера смотрим что за устройство, готовые решения в интернетах можно найти.
    Параметр нужен для того, чтобы отсеять посетителей не с qr кода. Ну он у вас уже есть, тащемта.
    Ответ написан
    Комментировать