Задать вопрос
  • Как сделать филтер структуры?

    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 Куратор тега 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 комментарий
  • Почему не открывается приложение на iphone?

    s_panteleev
    @s_panteleev
    25 yo, Yaroslavl
    Устанавливаю Ipa файл через Itunes 12.6.3

    А почему не через TestFlight решили?
    В новых версиях itunes, эппл выпилили возможность переносить .ipa на устройство напрямую, возможно, проблема в некорректном переносе

    Если есть возможность, попробуйте закинуть ipa через тестфлай или, например, HockeyApp

    Если не поможет – покажите, пожалуйста, app.json
    Ответ написан
    5 комментариев
  • Как заменить тире на точку?

    @pcdesign
    <Text> { item.date.replace(/\-/g, '.') } </Text>
    Ответ написан
    1 комментарий
  • Как сделать preload страницы?

    @pcdesign
    Я взял себе вот это решение:
    https://stackoverflow.com/a/50891389/4549490
    Вроде работает.
    Ответ написан
    Комментировать
  • Как сделать preload страницы?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    я сделал view, затем сделал его прозрачным и не много затемнил по центру разместил preloader. как только приложение стартует я сразу показываю этот view. у webview есть метод onLoadEnd как только от отрабатывает я прячу preloader. Только помните что view  c preloader  должно обязательно иметь position:"absolute" и не как не в один момент показывать view а в другой прятать webview.
    Ответ написан
    Комментировать
  • Как рендерить разные страницы React Native?

    s_panteleev
    @s_panteleev
    25 yo, Yaroslavl
    render() {
    let token = null;
    AsyncStorage.getItem('token')
        .then((value) => {
          if(value !== null) {
            token = value;
          }
     });
    
    	return (
    		{token !== null ? (
    		    <View>
    		    	<Text>Токен есть</Text>
    		    </View>
    		) : (
    		    <View>
    		    	<Text>Токена нет</Text>
    		    </View>
    		)}
    	)
    }
    Ответ написан
    9 комментариев
  • Работал ли кто-нибудь с NFC на React Native | Expo?

    s_panteleev
    @s_panteleev
    25 yo, Yaroslavl
    В Expo без detach NFC пока не подключить. Если проект на RN с ExpoKit или чистом RN, то можно поставить, например, react-native-nfc-manager.
    Ответ написан
    Комментировать
  • Как реализовать OAuth2 на React Native Expo?

    s_panteleev
    @s_panteleev
    25 yo, Yaroslavl
    При первичной авторизации записать access_token,refresh_token и expires_in в SecureStore

    Далее в запросах проверять не истек ли expires_in - если истек, делать запрос на обновление токена, обновив данные в SecureStore, если не истек – сделать запрос с текущим токеном

    Проверять ошибки запроса, если запрос не прошел (например, токен отозвали) – также послать запрос на обновление токена
    Ответ написан
    2 комментария