#flutter #dart
Вопрос:
В dart
, поскольку я новичок в использовании extension
, я хочу сделать простой extension
, чтобы проверить, что значение удвоено.
extension numberExtension on num{
bool get isInteger => (this % 1) == 0;
bool get isDouble =>double.tryParse(this) != null;
}
вот isInteger
правильно, но для isDouble
меня получается эта ошибка:
Тип аргумента » num «не может быть назначен типу параметра «String»
Проблема this
в isDouble
геттере!?
Комментарии:
1.
bool get isDouble => !isInteger;
Ответ №1:
Предполагая, что все, что не является целым числом, является плавающим или двойным;
Почему isDecimal
бы вместо этого не реализовать что-то вроде:
extension numberExtension on num {
bool get isInteger => (this % 1) == 0;
bool get isDecimal => (this % 1) != 0;
}
или
extension numberExtension on num {
bool get isInteger => this is int;
bool get isDecimal => !(this is int);
}
Обратите внимание, что мы могли бы напрямую использовать «
this is double
» выше,
но!(this is int)
проверка «» просто более совместима с изменениями,
потому что она будет работать даже в том случае, еслиDart
когда-либо добавит какой-либо новыйnum
подтип.
Обновление; просмотр документов говорит нам, что:
- Если скомпилировать в
JavaScript
, то реальногоint
типа не будет, только удвоения без десятичной дроби. - Dart , похоже, не поддерживает 32-разрядную
float
версию, но имеетdouble
по крайней мере 64-разрядную. int
всегда 64-разрядный (какdouble
и ), но побитовые операторы и/или операторы сдвига усекают его до 32-разрядного (потеря данных или перцепция).
Ответ №2:
Заменить double.tryParse(this) != null
на this is double
Ответ №3:
Ваш оригинальный подход:
extension numberExtension on num { bool get isInteger => (this % 1) == 0; bool get isDouble =>double.tryParse(this) != null; }
не работает , потому что ваш добавочный номер включен num
, как this
и a num
. double.tryParse
ожидает анализа a String
.
Почему бы вам просто не проверить, является ли объект int
прямым или double
прямым?
extension numberExtension on num {
bool get isInteger => this is int;
bool get isDouble => this is double;
}
Конечно, расширение не очень полезно, так x.isDouble
как оно не намного удобнее в использовании, чем x is double
прямое использование, и последнее имеет то преимущество, что позволяет автоматически продвигать тип.
(Кроме того, для Dart для Интернета, где int
double
оба типа и поддерживаются числами JavaScript, числа могут быть представлены как int
и double
, но использование эвристики, такой как % 1
и double.tryParse
, не поможет в этом.)