#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:
Ответ №3:
Похоже, что многие ответы разрешаются вокруг опечаток и дополнительных областей, оставленных открытыми или преждевременно закрытых. Однако, на случай, если некоторые люди столкнутся с этой проблемой, намеренно пытаясь объявить функцию в глобальной области видимости как static
, необходимо внести уточнение:
Все функции в глобальной области статически связаны внутри исполняемого файла / библиотеки, что является причиной, по которой они доступны глобально, в первую очередь, из любой области. Однако в контексте объектно-ориентированного языка, которым, несомненно, является Swift, распределение экземпляров классов по дизайну разрешено (и ожидается) динамическим, поэтому фактический адрес памяти, по которому в конечном итоге будет выделен экземпляр, заранее неизвестен. Итак, вот что мы делаем — мы объявляем функции как статические, чтобы явно сообщить компилятору, что, хотя эта функция принадлежит этому классу, она должна быть привязана не к конкретному экземпляру class, а к самому классу, что позволяет получить к нему доступ из любого места. В этом отношении мы могли бы сказать, что все функции в глобальной области видимости неявно статичны.