• C++ составить все возможные комбинации строки из чисел, с определённой длиной?

    doublench21
    @doublench21
    Если я не забыл комбинаторику, то это размещение с повторениями из N по K. Реализация в гугле спокойно ищется.

    https://prog-cpp.ru/placement/
    Ответ написан
    1 комментарий
  • Как убрать выделение segmentedControl?

    doublench21
    @doublench21 Куратор тега Swift
    let sc = UISegmentedControl()
    sc.selectedSegmentIndex = UISegmentedControl.noSegment
    Ответ написан
    6 комментариев
  • Как лучше обновлять контент в приложении?

    doublench21
    @doublench21 Куратор тега Swift
    Дисклеймер: Не изобретайте велосипед!


    У меня глаза на лоб лезут от подобных вопросов.

    Ну есть у Вас данные, которые на момент запуска приложения должны быть строго актуальными, ТО это самые обычные запросы на сервер. Ровно так же как и в любом другом приложении. Заходишь в приложение, приложение отправляет запрос на сервер, а сервер отдаёт. Вы парсите, после отображаете информацию. НЕТ абсолютно никакой разницы изменилось там что-то или нет. Вы ведь просто запрашиваете JSON.

    Я ещё могу понять, если вы передаёте некий файл размеров в 10GB и который не хочется качать снова, если он не изменился. Тут я могу понять ваши опасения. Ну даже в таком случае, такие вопросы решаются на сервере путём нужных заголовков. Один из них E-TAG. Всё уже давно за вас придумали.

    Возвращаясь к вопросу автора. Если всё о чем мы говорим - это лишь JSON составленный из БД, то не мучайте сами знаете что. Просто сделайте запрос и всё. Не важно изменились ли там данные или нет. Обо всём остальном позаботится кэш, как на клиенте(URLSession), так и на сервере.

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

    Когда делать запросы на сервер?

    Ну смотря где эти данные отображаются.
    • данные относятся глобально ко всему приложения и могут использоваться в любом контроллере, тогда:
      func application(
              _ application: UIApplication,
              willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
          ) -> Bool {
              // ...
              return true
          }

      или
      func application(
              _ application: UIApplication,
              didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
          ) -> Bool {
             // ...
              return true
          }

      или как инициализация св-ва вообще в AppDelegate

    • если данные нужны лишь для конкретного контроллера, то как уже написали выше:
      override func viewDidLoad()  {
          super.viewDidLoad()
         // ...
       }

    Ответ написан
    8 комментариев
  • На чем лучше делать приложение для андроид-ios, по типу spotify?

    doublench21
    @doublench21
    Обязательно должен быть премиум дизайн
    - давно я так не ржал...

    Неужели сильно сложно в голове прокрутить пару мыслей:
    • Какие языки я знаю? Swift или Java. А может таки JS
    • Если я ничего из этого не знаю, то наверное в кратчайшие сроки мне такое не осилить? Тем более у меня КРОВЬ ИЗ НОСУ должен быть премиум дизайн
    • Но я хотя бы знаю JS? Знаю и я где-то слышал, что можно писать под обе платформы сразу.
    • А может мне погуглить? Нашел, это React native. Но ещё кажется есть прогрессирующий Flutter.
    Ответ написан
  • Ios developer старт обучения?

    doublench21
    @doublench21 Куратор тега Swift
    Комментировать
  • Какие книги лучше выбрать для iOS-разработки?

    doublench21
    @doublench21 Куратор тега Swift
    Одно и тоже каждый месяц.

    - Знаешь swift?
    - Нет
    https://books.apple.com/us/book/the-swift-programm...

    - Знаешь английский?
    - Да
    https://www.youtube.com/playlist?list=PLPA-ayBrweU...

    - Не можешь понять что-то из курса выше?
    - Да
    https://www.raywenderlich.com/
    Ответ написан
    Комментировать
  • Как грамотно реализовать задачу(описание ниже)?

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

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

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

    doublench21
    @doublench21 Куратор тега Swift
    Каждый раз одно и тоже. Запомните уже наконец:

    - Cостояние, когда ваше приложение находится в выключенном состоянии, вы не можете делать абсолютно НИЧЕГО.

    - Состояние, когда ваше приложение находится в свернутом состоянии, вы можете делать лишь очень малое количество действий с ещё более малым отведенным под это дело временем. Время в данном случае абсолютно неконтролируемое. Система сама решает, когда и что нужно запускать в таком состоянии.

    Поэтому такого рода приложения, который пытаются что-то делать в свёрнутом состоянии в нужное ИМ время не могут и не будут существовать.

    Коим я с Apple полностью согласен. Кому нужно приложение, которое по его прихоти будет делать в фоне, то, что оно хочет и главное, когда хочет. Если я его закрыл или свернул, значит оно мне не интересно.
    Ответ написан
    Комментировать
  • Прочитал The Swift Programming Language (Swift 5.0). Куда двигаться дальше?

    doublench21
    @doublench21 Куратор тега Swift
    А теперь тебя ждёт разочарование, ведь для разработки под iOS - это ничто :) Начинай смотреть/читать материалы. Одним из лучших является Стэнфордский куре по iOS разработке. Ютуб и вперёд.

    Книга это хорошо и ты её ещё не раз будешь перечитывать, ЕСЛИ не будешь практиковаться. Придумай для себя какую-то полезную программу и делай. Или попробуй сделать аналог того, что уже есть. Пусть и без каких-либо сложных данных, просто UI.
    Ответ написан
    Комментировать
  • Как в массиве, состоящем из элементов дочерних классов, обратиться к свойствам дочерних классов без приведения типа?

    doublench21
    @doublench21 Куратор тега Swift
    Нельзя! Это и есть суть строго типизированных языков.
    type(of: ) это вывод типа динамически, но компилятору глубоко и с колокольни до этого. Он видит только тип, который Вы указали изначально. Это и правильно! Нет никаких если, если вам нужна некая функциональность у потомков в рамках родителя, то создавайте протокол и описывайте их. Это основы ООП
    Ответ написан
    6 комментариев
  • Запустить мое приложение программно в IOS, swift?

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

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

    doublench21
    @doublench21
    Вот от таких умников в мире веба давны давно есть CORS. Можете не пытаться.
    Ответ написан
    1 комментарий
  • Реализация вывода информации в Telegram через бота на php?

    doublench21
    @doublench21
    images?q=tbn:ANd9GcQSgpId30-Ot3b-0jvy8An
    Ответ написан
    Комментировать
  • Как реализовать фоновую задачу когда приложение выключено?

    doublench21
    @doublench21 Куратор тега Swift
    НЕЛЬЗЯ! И вполне правильно, если я закрыл приложение, я должен быть уверен, что оно не будет работать от слова совсем, иначе это уже какое-то Ведро выходит.

    BackgroundFetching - это только про свёрнутое приложение.
    Ответ написан
    6 комментариев
  • Swift iOS Как измерить скорость соединения?

    doublench21
    @doublench21 Куратор тега Swift
    Если делать надёжно, можно взять всем известный ipef3, исходники на Си благополучно находятся здесь https://github.com/esnet/iperf
    Пишите простую обёртку на Swift с нужными Вам типами измерений над этой библиотекой. (Это делается очень легко, информации куча)
    Ну собственно теперь подключается свою обёртку на Swift(import MySwiftIperf) и начинаете измерять.

    Если делать проще, то можно качать обычным URLSession некий большой файл. У URLSession есть отличный делегат, в котором можно глянуть текущую порцию скаченных данных. Этого достаточно для измерения скорости. Начальное время, текущее время, текущее кол-во скаченных байт, всё это делим на нужное измерение в кб/мб/...

    P.S. Красивая стрелка это тема для отдельного разговора.
    Ответ написан
    1 комментарий
  • Как сделать филтер структуры?

    doublench21
    @doublench21 Куратор тега Swift
    Покажу вам два варианта.

    --------------------------------------------------------
    Вариант простой(aka Думми):
    Обычная фильтрация, после того как память уже выделена. Просто, но разброс по памяти и скорость ниже.
    Код с подсветкой
    5d1398ab0b187603385123.png


    --------------------------------------------------------
    Вариант продвинутый:
    Исправляем наименование свойств.
    Преобразуем даты в соответствующий формат.
    Проводим свою кастомную кодировку, отслеживая статус и выкидывая ошибку, дабы не выделять зря память.
    Код с подсветкой
    2QkNeGLn.png
    Код текстом
    import Foundation
    
        let json = """
        [{
            "idSite": 204233,
            "status": 0,
            "Name": "",
            "timeOfStatus": null
        },
        {
            "idSite": 204234,
            "status": 0,
            "Name": "",
            "timeOfStatus": null
        },
        {
            "idSite": 204235,
            "status": 0,
            "Name": "",
            "timeOfStatus": null
        },
        {
            "idSite": 204236,
            "status": 1,
            "Name": "OK",
            "timeOfStatus": "2019-06-26 12:58:16"
        }]
        """
    
        struct SomeStruct: Decodable {
          let idSite: Int
          let status: Bool
          let name: String
          let timeOfStatus: Date?
    
          // Преобразуем Name -> name
          private enum CodingKeys: String, CodingKey {
            case idSite
            case status
            case name = "Name"
            case timeOfStatus
          }
    
          init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
    
            self.idSite = try container.decode(Int.self, forKey: .idSite)
    
            // Выбрасываем ошибку, если статус не равен 1. Не выделяем зря память.
            let status = try container.decode(Int.self, forKey: .status)
            if status == 1 {
              self.status = true
            } else {
              throw DecodingError.dataCorruptedError(forKey: .status, in: container, debugDescription: "Status mast be `1`")
            }
    
            self.name = try container.decode(String.self, forKey: .name)
    
            // Преобразуем строку с датой в объект для работы с датами Date
            let date = try? container.decode(String.self, forKey: .timeOfStatus)
            let dateFormatter: DateFormatter = {
              $0.dateFormat = "yyyy-MM-dd HH:mm:ss"
              $0.calendar = Calendar(identifier: .iso8601)
              $0.timeZone = TimeZone(secondsFromGMT: 0)
              $0.locale = Locale(identifier: "en_US_POSIX")
              return $0
            }(DateFormatter())
            self.timeOfStatus = date != nil ? dateFormatter.date(from: date!) : nil
          }
        }
    
        // Тип обёртка, которая даст легко отфильтровать данные, от тех, которые не прошли из-за статуса.
        enum Throwable<T: Decodable>: Decodable {
          case success(T), failure(Error)
    
          init(from decoder: Decoder) throws {
            do {
              let decoded = try T(from: decoder)
              self = .success(decoded)
            } catch let error {
              self = .failure(error)
            }
          }
    
          var value: T? {
            switch self {
            case .failure(_):
              return nil
            case .success(let value):
              return value
            }
          }
        }
    
    
        let decoder = JSONDecoder()
        let arrayOfSomeStructs = try! decoder.decode([Throwable<SomeStruct>].self, from: json.data(using: .utf8)!)
        let filteredArrayOfSomeStructs = arrayOfSomeStructs.compactMap{ $0.value }
        print(filteredArrayOfSomeStructs.count)
    Ответ написан
    Комментировать
  • Как составить регулярное выражение?

    doublench21
    @doublench21
    HTML полностью описывается лишь контекстно-свободной грамматикой, но никак не регулярной грамматикой. Контекстно-свободная грамматикой включает в себя регулярную грамматику, поэтому иногда пропарсить что-то и получается, но так делать не стоит, полагаясь на авось, если вы только не уверенны на 100%

    Лучше воспользоваться чем-то таким: https://github.com/Imangazaliev/DiDOM
    Ответ написан
    1 комментарий
  • Как решить ошибку "unrecognized selector sent to instance"?

    doublench21
    @doublench21 Куратор тега Swift
    5d10efdae0912561988174.png

    Код
    func playVideo(filename: String) {
        let path = Bundle.main.path(forResource: filename, ofType:"mp4")!
        player = AVPlayer(url: NSURL(fileURLWithPath: path) as URL)
    
        playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = CGRect(x: 880, y: 270, width: 960, height: 540)
        scene!.view!.layer.addSublayer(playerLayer)
    
        player.actionAtItemEnd = .none
        player.play()
    
    
    
        DispatchQueue.main.async {
          NotificationCenter.default.addObserver(self,
                                                 selector: #selector(playerItemDidReachEnd),
                                                 name: NSNotification.Name.AVPlayerItemDidPlayToEndTime ,
                                                 object: self.player.currentItem)
        }
      }
    
      @objc func playerItemDidReachEnd(notification: NSNotification) {
        print("repeating...")
    
        let seconds : Int64 = 0
        let preferredTimeScale : Int32 = 1
        let seekTime : CMTime = CMTimeMake(value: seconds, timescale: preferredTimeScale)
    
        player.seek(to: seekTime)
        player.play()
      }
    Ответ написан
    1 комментарий
  • Как правильно сделать структуру?

    doublench21
    @doublench21 Куратор тега Swift
    Простой пример:

    2ffZng2.png

    Код
    let json = """
        [{
        "invoiceNumber": "FV/MON/X/369",
        "date": "2019-06-01 00:00:00",
        "dueDate": "2019-06-01 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/368",
        "date": "2019-06-01 00:00:00",
        "dueDate": "2019-06-01 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/367",
        "date": "2019-06-01 00:00:00",
        "dueDate": "2019-06-01 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/366",
        "date": "2019-06-01 00:00:00",
        "dueDate": "2019-06-01 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/363",
        "date": "2019-05-04 00:00:00",
        "dueDate": "2019-05-04 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/362",
        "date": "2019-05-04 00:00:00",
        "dueDate": "2019-05-04 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/361",
        "date": "2019-05-04 00:00:00",
        "dueDate": "2019-05-04 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        },
        {
        "invoiceNumber": "FV/MON/X/360",
        "date": "2019-05-04 00:00:00",
        "dueDate": "2019-05-04 00:00:00",
        "overdue": true,
        "valueNoTax": 100,
        "valueWithTax": 123,
        "valueToPay": 123
        }]
        """
    
        struct FakturyObject: Decodable {
          let date: String
          let dueDate: String
          let invoiceNumber: String
          let overdue: Bool // <---- ОШИБКА БЫЛА ТУТ! 
          let valueNoTax: Int
          let valueToPay: Int
          let valueWithTax: Int
        }
    
        let data = json.data(using: .utf8)
        let decoder = JSONDecoder()
        let parsedData = try! decoder.decode([FakturyObject].self, from: data!)
    Ответ написан
    1 комментарий
  • Как отловить изменения динамической строки в таблице в SWIFT?

    doublench21
    @doublench21 Куратор тега Swift
    Этот код абсолютно ужасен.
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "chat") as! ChatsTableViewCell;
            cell.imageUser.image = UIImage.convertBase64ToImage(imageString: (data?.list[indexPath.row].imageUser)!)
            cell.imageUser.layer.cornerRadius =  cell.frame.size.height / 2;
            cell.imageUser.clipsToBounds = true;
            return cell;
    }


    Во-первых, не нужно делать каждый раз то, что можно и нужно сделать один раз.
    Во-вторых, вы ведь всегда можете отследить изменения размеров, просто переопределив соответсвующее св-во.
    (Если у вас ячейка определена в сториборде, то первые два метода можно удалить и записать всё в методе awakeFromNib)
    Ещё внутри предопределенного св-ва я написал функцию printf. Посмотрите, сколько раз вызывается эта функция и сравните с тем, сколько раз будет вызываться ваш код в
    tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)


    5d0f6aaef237c045355418.png

    Код
    import UIKit
    
    final class Cell: UITableViewCell {
    
      override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    
        imageView?.clipsToBounds = true
        imageView?.contentMode = .scaleAspectFit
      }
    
      required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
      }
    
      override var frame: CGRect {
        didSet {
          guard frame.height != oldValue.height else { return }
          imageView?.layer.cornerRadius = frame.height / 2.0
          print(#function)
        }
      }
    }
    
    final class TableViewController: UITableViewController {
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
    
        tableView.register(Cell.self, forCellReuseIdentifier: "Cell")
      }
    
      override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 21;
      }
    
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.imageView?.image = UIImage(named: "c-1-8")!
        cell.textLabel?.text = "Ooops";
        return cell;
      }
    
      override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return tableView.frame.width * 0.25;
      }
    }



    5d0f6c640a520243262603.png

    P.S. Надеюсь я Вас правильно понял.
    Ответ написан