Разница между методом типа и методом экземпляра экземпляра и т.д.?

Примечание. Я прочитал документацию на яблоко и изучил быструю книгу.

  • Я запутался в различии между "методом экземпляра типа" (если такое существует, исправьте меня, если я ошибаюсь) и метод типа?

  • Разница между методом класса и методом экземпляра?

  • Разница между свойством типа и свойством экземпляра (если таковой существует, извините, я очень смущен теме Subject Type)?

  • Наконец, существуют ли свойства класса в swift?

Извините за путаницу: '(

Ответ 1

В 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")
    }
} 
  • Я смущен различием между методом экземпляра типа " (если такое существует, исправьте меня, если я ошибаюсь) и метод типа?

Как упоминалось ранее, тип относится к классу, структуре, перечислению, протоколу и составным типам. В моем примере выше я использую класс с именем Circle для определения типа.

Если я хочу создать отдельный объект класса Circle, я бы создал экземпляр. Например:

let myCircleInstance = Circle(radius: 4.5)
let anotherCircleInstance = Circle(radius: 23.1)

Вышеуказанные объекты или экземпляры из Circle. Теперь я могу напрямую вызвать методы экземпляров. метод экземпляра, определенный в моем классе, area.

let areaOfMyCircleInstance = myCircleInstance.area()

Теперь метод типа - это метод, который можно называть напрямую для типа без создания экземпляра этого типа.

Например:

Circle.printTypeName()

Обратите внимание, что перед func есть определитель static. Это означает, что он относится к типу напрямую, а не к экземпляру типа.

  1. Разница между методом класса и методом экземпляра?

См. объяснение выше.

  1. Разница между свойством типа и свойством экземпляра (если такое существует, извините, я очень запутался в теме Type Properties)?

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

В моем примере 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
  1. Наконец, существуют ли свойства класса в swift?

Абсолютно! Прочтите мое объяснение на свой вопрос 3 выше. Свойство PI в моем примере является примером свойства класса.

Литература:

Ответ 2

Разница в том, что методы экземпляра и свойства создаются для каждого экземпляра. Типы типов и свойства создаются для всего типа

Скажем, у вас есть структура 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. Он создается для каждого экземпляра и имеет доступ к его свойствам и методам в этом случае для полей экземпляра var. Поэтому его называют "методом экземпляра"

Вы получаете доступ к свойствам и методам экземпляра, ссылаясь на экземпляр (в нашем случае e0 и e1)

ИД и ИМЯ - это свойства типа или статические свойства. Они создаются только один раз и имеют одинаковое значение для каждого экземпляра и для каждого другого объекта. Вы получаете доступ к свойствам типа, ссылаясь на "тип" (в нашем случае на struct) Employee.NAME

Методы типа являются чем-то вроде глобальной функции для типа (struct, class, enum). Они обычно используются для инкапсуляции функциональных возможностей, привязанных к типу, но не требующих экземпляра. Как и в примере, метод метода getNameOfField (index: Int) → String возвращает имя поля на основе индекса. Чтобы вернуть эту информацию, вам не нужно создавать экземпляр Employee

Типы - это структуры, классы и перечисления

Вы определяете методы и свойства типа с ключевым словом static (почему они также называются статическими методами и свойствами)

Структуры и перечисления могут иметь свойства типа и методы типа. Классы могут иметь только методы типа. Вы можете создать свойство типа, но оно должно быть вычислительным

В классах вы можете определить методы типа с ключевым словом static или class. Разница в том, что методы класса могут быть переопределены.

Ответ 3

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")
}
}

Затем начните попробовать Circle.printTypeName или примеры, показанные выше! Отличный материал!

Ответ 4

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

Но, если вам нужно использовать метод, но не нужно инициировать объект, скажем, глобальный параметр (например, authorizationStatus() в CLLocationManager для авторизации GPS-координат), вы можете создать метод типа и просто обратиться к имени типа (НЕ), а затем вызвать вызов функции классического doc-функции.