Чтобы проверить, является ли объект числом (Int
в вашем случае), вы можете сделать две вещи:
Проверка типа через is
или as?
[1130 ]
Это проверяет только тип, а не содержимое
let isNumberType = "1" is Int
print(isNumberType) //false because "1" is of type String
Создание Int
через его инициализатор [1132 ]
Возвращает Int?
, потому что он может потерпеть неудачу, поэтому проверьте далее != nil
let something = "1"
let isNumber = Int(something) != nil
print(isNumber) //true because "1" can be made into an Int
ПРИМЕЧАНИЕ. Согласно вашему примеру, вы проверяете только четные элементы, поэтому мы будем использовать stride(from:to:by:)
Предполагая, что у вас есть массив String
с, мы можно использовать инициализатор Int
, чтобы проверить, может ли элемент string
быть числом, например:
func check(expression: [String]) -> Bool {
for idx in stride(from: 0, to: expression.count, by: 2) {
let isNumeric = Int(expression[idx]) != nil
if isNumeric == false {
return false
}
}
return true
}
check(expression: ["1", "A", "2", "B", "3", "C"]) //true
check(expression: ["1", "A", "2", "B", "E", "C"]) //false
Предполагая, что ваш массив имеет наберите [Any]
, и вы хотите напечатать, проверьте, чтобы альтернативные элементы были Int
, затем используйте is
, например, так:
func check(expression: [Any]) -> Bool {
for idx in stride(from: 0, to: expression.count, by: 2) {
let isNumeric = expression[idx] is Int
if isNumeric == false {
return false
}
}
return true
}
check(expression: [1, "A", 2, "B", 3, "C"]) //true
check(expression: [1, "A", 2, "B", "3", "C"]) //false
С [Any]
дело в том, что его элементы не могут быть подается непосредственно в инициализатор Int
, не внося его в o приемлемый тип.
Так что в этом примере, для простоты, мы просто проверяем, принадлежит ли объект точно типу Int
или нет.
Поэтому я сомневаюсь, что это соответствует вашему требованию.
Если Вы испытываете желание назвать метод класса от экземпляра, Вам, вероятно, не нужен метод класса.
В примере Вы дали статический метод, будет более соответствующим точно из-за Вашего последнего комментария (никакое self/cls взаимодействие).
class C(object):
@staticmethod
def f(x):
return x + x
этим путем это - "хорошая форма", чтобы сделать обоих
c = C()
c.f(2)
и
C.f(2)
Это главным образом просто путает взгляд. Если бы я использовал Ваш класс и видел это, то он заставил бы меня задаться вопросом, что другие неожиданности там, он просто похож на плохой дизайн.
Существует ли причина, это не просто staticmethod?
Я не вспоминаю использование classmethod как это снаружи класса, но это, конечно, хорошо для метода экземпляра назвать classmethod на себе (например. self.foo()
где foo
classmethod). Это удостоверяется, что наследование действует как ожидалось и будет звонить .foo()
в правильном подклассе вместо базового класса.
C.f()
более ясно, чем c_instance.f()
, и c_instance.__class__.f()
просто ужасно. Так как ясность и красота являются нежно любимыми характеристиками в сообществе Python, я был бы склонен говорить, что C.f () является оптимальным маршрутом.
Есть ли какая-либо конкретная причина, которую Вы даже хотите назвать им любым из других способов?
Если у Вас уже есть экземпляр C, почему Вам нужен f (), чтобы быть методом класса? Не только это невоспитанность, обычно не необходимый. Кто-то в сети говорит: "Это плохо, потому что это создает впечатление, что некоторые переменные экземпляра в объекте используются, но это не имеет место".
Хотя, страница 484 изучения Python отмечает, что можно назвать метод так или иначе, и это будет точно то же, пока Вы передаете тот же экземпляр в.