Статические методы могут быть объявлены только для типа

#swift

#swift

Вопрос:

Я получаю сообщение об ошибке, в котором говорится:

Статические методы могут быть объявлены только для типа

Как я могу это решить?

 public static func random(min min: CGFloat, max: CGFloat) -> CGFloat {

    return CGFloat.random() * (max - min)   min
}
  

Вот как я вызываю вышеупомянутый метод из класса SWIFT.

 var ran = CGFloat.random(min:-255, max:588)
  

Комментарии:

1. Разве статический метод не является другим именем для метода типа? Таким образом, «Методы типа могут быть объявлены только для типа», кажется, имеет смысл. С какой проблемой вы столкнулись?

2. Я здесь немного новичок. Не могли бы вы уточнить, пожалуйста. @SteveIves

3. Если вы хотите random(min:max:) быть методом типа в CGFloat , тогда вам нужно определить его в CGFloat расширении.

4. @Illep — метод типа — это то, что на другом языке OO называлось бы методом класса — это метод, который не обязательно должен быть связан с конкретным экземпляром класса. Например. метод CGFloat random не воздействует на конкретный CGFloat, таким образом, это метод класса или типа, и вам не обязательно создавать экземпляр CGFloat, чтобы использовать его. Для методов экземпляра потребуется экземпляр типа, для которого вызывается функция.

5. @Hamish — ты прав — у меня уже был набор расширений Swift с random, определенным как расширение для CGFloat.

Ответ №1:

Причина, по которой я получил это сообщение об ошибке в немного запутанном месте, заключалась в том, что ранее в классе у меня отсутствовала закрывающая скобка.

Компилятору показалось, что объявление находится внутри другого метода. По этой причине сообщение об ошибке появилось в месте, которое в остальном казалось нормальным. Само сообщение об ошибке находится на точке.

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

Комментарии:

1. Это спасло меня 🙂

Ответ №2:

Я получил ту же ошибку из-за дополнительных закрывающих круглых скобок в первом class .

введите описание изображения здесь

Ответ №3:

Похоже, что многие ответы разрешаются вокруг опечаток и дополнительных областей, оставленных открытыми или преждевременно закрытых. Однако, на случай, если некоторые люди столкнутся с этой проблемой, намеренно пытаясь объявить функцию в глобальной области видимости как static , необходимо внести уточнение:

Все функции в глобальной области статически связаны внутри исполняемого файла / библиотеки, что является причиной, по которой они доступны глобально, в первую очередь, из любой области. Однако в контексте объектно-ориентированного языка, которым, несомненно, является Swift, распределение экземпляров классов по дизайну разрешено (и ожидается) динамическим, поэтому фактический адрес памяти, по которому в конечном итоге будет выделен экземпляр, заранее неизвестен. Итак, вот что мы делаем — мы объявляем функции как статические, чтобы явно сообщить компилятору, что, хотя эта функция принадлежит этому классу, она должна быть привязана не к конкретному экземпляру class, а к самому классу, что позволяет получить к нему доступ из любого места. В этом отношении мы могли бы сказать, что все функции в глобальной области видимости неявно статичны.