English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Методы Swift - это функции, связанные с определенными типами
В Objective-C классы - единственный тип, который может определять методы. Но в Swift вы можете выбрать, хотите ли вы определить класс/структуру/枚举, а также гибко определять методы на созданных типах (классах/структурах/枚举ах).
В языке Swift примерные методы принадлежат методам примера определенного класса, структуры или типа枚ерации.
Примерные методы предоставляют следующие методы:
Могут обращаться и изменять примерные свойства
Предоставлять функции, связанные с целями примера
Примерные методы должны быть написаны между фигурными скобками ({}) своего типа.
Примерные методы могут неявно обращаться ко всем другим примерным методам и свойствам своего типа.
Примерные методы могут быть вызваны только определенными примерами своего класса.
Примерные методы не могут быть вызваны независимо от существующих примеров.
func funcname(Parameters) -> returntype { Декларация1 Декларация2 …… Декларация N возврат параметров {}
import Cocoa class Counter { var count = 0 func increment() { count += 1 {} func incrementBy(amount: Int) { count += amount {} func reset() { count = 0 {} {} // Начальное значение счетчика 0 let counter = Counter() // Значение счетчика теперь 1 counter.increment() // Значение счетчика теперь 6 counter.incrementBy(amount: 5) print(counter.count) // Значение счетчика теперь 0 counter.reset() print(counter.count)
Результат выполнения программы приведен выше:
6 0
Класс Counter определяет три примерных метода:
Counter Этот класс также объявляет переменную-свойство countс用它来追踪 текущее значение счетчика.
Параметры функции в Swift могут иметь как локальное имя (внутри тела функции), так и внешнее имя (при вызове функции)
Методы в Swift очень похожи на методы в Objective-C. Как и в Objective-C, имя метода в Swift обычно содержит предлог, указывающий на первый параметр метода, например: with, for, by и т.д.
Swift по умолчанию предоставляет локальное имя параметра только для первого параметра метода; по умолчанию для второго и последующих параметров предоставляются глобальные имена параметров.
В следующем примере 'no1' объявлен в Swift как локальное имя параметра. 'no2' используется для глобального объявления и доступа через внешнюю программу.
import Cocoa class division { var count: Int = 0 func incrementBy(no1: Int, no2: Int) { count = no1 / no2 print(count) {} {} let counter = division() counter.incrementBy(no1: 1800, no2: 3) counter.incrementBy(no1: 1600, no2: 5) counter.incrementBy(no1: 11000, no2: 3)
Результат выполнения программы приведен выше:
600 320 3666
Мы принудительно добавляем внешнее имя к первому параметру, чтобы использовать этот локальный имя в качестве внешнего имени (до Swift 2.0 использовался символ #).
Напротив, мы также можем использовать подчеркивание (_), чтобы установить второй и последующие параметры без предоставления внешнего имени.import Cocoa class multiplication { var count: Int = 0 func incrementBy(first no1: Int, no2: Int) { count = no1 * no2 print(count) {} {} let counter = multiplication() counter.incrementBy(first: 800, no2: 3) counter.incrementBy(first: 100, no2: 5) counter.incrementBy(first: 15000, no2: 3)
Результат выполнения программы приведен выше:
2400 500 45000
У каждого примера типа есть скрытый атрибут под названием self, который полностю эквивалентен самому примеру.
Вы можете использовать этот скрытый атрибут self в методе примера, чтобы ссылаться на текущий пример.
import Cocoa class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b print("Self 内: \(res)") {} func tot(c: Int) -> Int { return res - c {} func result() { print("Результат: \(tot(c: 20))") print("Результат: \(tot(c: 50))") {} {} let pri = calculations(a: 600, b: 300) let sum = calculations(a: 1200, b: 300) pri.result() sum.result()
Результат выполнения программы приведен выше:
Self: 900 Self: 1500 Результат: 880 Результат: 850 Результат: 1480 Результат: 1450
В Swift структуры и энумера являются типами значений. В общем, свойства типов значений не могут быть изменены в методах примеров.
Но если вам действительно нужно изменить свойства структуры или энумера в определенном методе, вы можете выбрать变异 (mutating) этого метода, и он сможет изменять свои свойства изнутри; и любые изменения, которые он делает, будут сохранены в исходной структуре после завершения метода.
Метод может также присваивать скрытому свойству self новый экземпляр, который заменит исходный экземпляр после завершения метода.
import Cocoa struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth {} mutating func scaleBy(res: Int) { length *= res breadth *= res print(length) print(breadth) {} {} var val = area(length: 3, breadth: 5) val.scaleBy(res: 3) val.scaleBy(res: 30) val.scaleBy(res: 300)
Результат выполнения программы приведен выше:
9 15 270 450 81000 135000
Мутабельные методы могут присваивать скрытому свойству self новый экземпляр.
import Cocoa struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth {} mutating func scaleBy(res: Int) { self.length *= res self.breadth *= res print(length) print(breadth) {} {} var val = area(length: 3, breadth: 5) val.scaleBy(res: 13)
Результат выполнения программы приведен выше:
39 65
Метод примера вызывается определенным примером типа, вы также можете определить метод, который сам тип вызывает, такой метод называется типовым методом.
Указывайте типовые методы структур и списков, добавляя ключевое слово static перед ключом func. Классы могут использовать ключевое слово class для разрешения наследования методов родительского класса.
Типовые методы и методы примеров вызываются с помощью синтаксиса точки (.)
import Cocoa class Math { class func abs(number: Int) -> Int { if number < 0 { return (-number) {} else { return number {} {} {} struct absno { static func abs(number: Int) -> Int { if number < 0 { return (-number) {} else { return number {} {} {} let no = Math.abs(number: -35) let num = absno.abs(number: -5) print(no) print(num)
Результат выполнения программы приведен выше:
35 5