Разница между методом типа и методом экземпляра типа и т. д.?
Примечание: я прочитал документацию apple и изучил книгу swift.
Я запутался в разнице между" методом экземпляра типа " (если таковой существует, исправьте меня, если я ошибаюсь) и методом типа?
разница между методом класса и методом экземпляра?
разница между свойством типа и свойством экземпляра(если такое существует, извините, я очень запутался в свойствах типа тема)?
наконец, существуют ли свойства класса в swift?
извините за сумбур :'(
5 ответов
В Swift, типы либо именованные типы или типы соединения. именованные типы включить классы, структуры, перечисления и протоколы. Помимо пользовательских именованных типов, Swift определяет множество именованных типов, таких как массивы, словари и необязательные значения. (Давайте пока проигнорируем составные типы, поскольку они не относятся непосредственно к вашему вопрос.)
чтобы ответить на ваши вопросы, предположим, что я создаю пользовательский класс под названием Circle
(это просто пример):
class Circle {
static let PI = 3.14
var radius: Double
init(radius: Double) {
self.radius = radius
}
// Returns the area of this circle
func area() {
return PI * radius
}
// Ridiculous class method for demonstration purposes
static func printTypeName() {
println("Circle")
}
}
- я запутался в разнице между " методом экземпляра типа" (если такое существует, поправьте меня, если я ошибаюсь) и метод типа?
как упоминалось ранее, a тип относится к классу, структуре, перечислению, протоколу и составным типам. В моем примере выше, я использую класс под названием Circle
определение тип.
если я хочу построить индивидуальный объект класса Circle, то я бы создал экземпляр. Например:
let myCircleInstance = Circle(radius: 4.5)
let anotherCircleInstance = Circle(radius: 23.1)
вышеуказанные объекты или экземпляров of Circle
. Теперь я могу вызвать методы экземпляра на них напрямую. The метод определено в моем классе area
.
let areaOfMyCircleInstance = myCircleInstance.area()
теперь, a метод типа - это метод, который можно назвать напрямую по типу без создания экземпляра этого типа.
например:
Circle.printTypeName()
обратите внимание, что есть static
квалификатор перед func
. Это указывает на то, что он относится к типу напрямую, а не к экземпляру типа.
- разница между методом класса и методом экземпляра?
см. объяснение выше.
- разница между свойством типа и свойством экземпляра(если такое существует, извините, я очень запутался в теме свойств типа)?
это аналогичное объяснение к одному в вашем вопросе один кроме что вместо применения к методам он применяется к свойствам (т. е. атрибутам, переменным) типа.
в своем Circle
например, свойства определяются как:
static let PI = 3.14
var radius: Double
свойства PI
является свойством типа; он может быть доступен непосредственно типом
Circle.PI
свойства radius
является свойством экземпляра типа; к нему может обращаться экземпляр типа. Используя переменные, которые мы создали ранее:
// I can do this; it will be 4.5
myCircleInstance.radius
// And this; it will be 23.1
anotherCircleInstance.radius
// But I CANNOT do this because radius is an instance property!
Circle.radius
- наконец, существуют ли свойства класса в swift?
абсолютно! Прочитайте мое объяснение на ваш вопрос 3 выше. The PI
свойство в моем примере является примером свойства класса.
ссылки:
разница в том, что методы и свойства экземпляра создаются для каждого экземпляра. Методы и свойства типа создаются для всего типа
допустим, у вас есть struct Employee
struct Employee {
static var ID:Int = 0
static var NAME:Int = 1
static func getNameOfField(index:Int) -> String {
var fieldName:String = ""
if index == ID {
fieldName = "Id"
} else if index == NAME {
fieldName = "Name"
}
return fieldName
}
var fields = [Int:String]()
mutating func config(id:String, name:String) {
fields[Employee.ID] = id
fields[Employee.NAME] = name
}
func getField(index:Int) -> String {
return fields[index]!
}
}
var e0 = Employee()
e0.config("1", name: "Mark")
var e1 = Employee()
e1.config("2", name: "John")
print(e0.getField(Employee.NAME)) // prints "Mark"
print(Employee.getNameOfField(Employee.ID)) // prints "Id"
каждый экземпляр структуры e0 и e1 имеет поля свойств. Она создается для каждого экземпляра и живет в нем. Значения, хранящиеся в свойстве fields, различны для каждого экземпляра. Вот почему он называется "свойство экземпляра"
каждый экземпляр также имеет метод getField. Она создается для каждого экземпляра и имеет доступ к его свойствам и методам в этом случае к полям экземпляра ВАР. Вот почему он называется "instance method"
вы получаете доступ к свойствам и методам экземпляра, ссылаясь на экземпляр (в нашем случае e0 и e1)
ID и NAME-это свойства типа или статические свойства. Они создаются только один раз и имеют одинаковое значение для каждого экземпляра и для каждого другого объекта. Вы получаете доступ к свойствам типа ссылка на" тип " (в нашем случае на структуру) сотрудника.Имя
методы типа-это что-то вроде глобальной функции для типа(struct, class, enum). Обычно они используются для инкапсуляции функций, связанных с типом, но не требующих экземпляра. Как и в примере, метод type getNameOfField (index:Int) -> String возвращает имя поля на основе индекса. Чтобы вернуть эту информацию, вам не нужно создавать экземпляр Employee
типы структуры, классы и перечисления
вы определяете методы и свойства типа с ключевым словом static (поэтому они также называются статическими методами и свойствами)
структуры и перечисления могут иметь свойства типа и методов типа. Классы могут иметь только методы типа. Вы можете создать свойство типа, но оно должно быть вычислительным
в классах можно определить методы типа с помощью ключевого слова static или class. Разница в том, что методы класса можно переопределить.
whyceewhite-большое спасибо! Вы прояснили то, что я просто не мог понять! Для тех из вас, кто пришел на эту страницу и работает на Swift 3+, см. код ниже, если вы хотите применить код на практике и увидеть статику в работе.
class Circle {
static let PI = 3.14
var radius: Double
init(radius: Double) {
self.radius = radius
}
// Returns the area of this circle
func area() -> Double {
return Double.pi * radius
}
// Ridiculous class method for demonstration purposes
static func printTypeName() {
print("Circle")
}
}
затем начните пробовать круг.printTypeName или примеры, показанные выше! Отличная штука!
Это все о областях, он определяет границу того, где и как вы можете использовать функцию. Метод может использоваться только после инициализации объекта из класса. Просто сказать, чтобы использовать метод, вы должны сначала создать объект, метод принадлежит объекту.
но что делать, если вам нужно использовать метод, но не нужно инициировать объект, скажем, глобальную настройку (например. authorizationStatus()
@PaulBart1 исправление примера @whyceewhite немного сложно, потому что он заменяет объявленный PI для pi, который является постоянным известным значением по умолчанию swift. Я переписал этот пример для Swift 4 следующим образом:
class Circle {
//static let PI = 3.14 -> error: static member 'PI' cannot be used on instance of type 'Circle'
let PI: Double = 3.1415
var radius: Double
init (radius: Double) {
self.radius = radius
}
// Return the area of this Circle
func area() -> Double {
return PI * radius
}
// Radius class method for demonstration purposes
static func printTypeName() {
print("Circle")
}
}
let myCircleInstance = Circle(radius: 4.5)
let anotherCircleInstance = Circle(radius: 23.1)
Circle.printTypeName() // Circle
print(myCircleInstance.area()) // 14.13675
print(anotherCircleInstance.area()) // 72.56865
//