Передача экземпляра в метод экземпляра делает ссылку на этот метод экземпляра? - PullRequest
0 голосов
/ 04 марта 2020

In iOS 13 Основы программирования с помощью Swift от Matt Neuburg Я наткнулся на этот странный фрагмент кода

class MyClass {
    var s = ""
    func store(_ s:String) {
        self.s = s
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        let m = MyClass()
        let f = MyClass.store(m) // what just happened!?
        f("howdy")
        print(m.s) // howdy
    }

}

Очевидно, что f имеет тип () -> () (вот что это говорит по крайней мере об отладчике) и все же на следующей строке мы передаем ему строку.

Исходя из результата, кажется, что f каким-то образом стал ссылкой на метод store, поэтому при печати m.s получается "привет". Но этот код действительно сбивает меня с толку, и объяснение того, что происходит, очень ценится.

Я даже не понимаю, как MyClass.store является законным, потому что store является методом экземпляра, и в этом случае это упоминается, как если бы это был метод * * * * * * * * * * *

Ответы [ 2 ]

3 голосов
/ 05 марта 2020

Следующие слова в книге говорят вам ответ:

Причина в том, что метод экземпляра на самом деле является статическим методом класса / карри, состоящим из двух функций - одна функция, которая принимает экземпляр, и другая функция, которая принимает параметры метода экземпляра. После этого кода f является секундой этих функций и может вызываться как способ передачи параметра в store метод экземпляра m.

2 голосов
/ 05 марта 2020

Любой метод экземпляра в Swift также может вызываться статически, но если вы делаете это, вам нужно передать ему экземпляр для работы. Так, например, вы можете отсортировать массив следующим образом:

let sortedArray = Array.sort([13, 8, 21, 3, 1, 34, 5, 1, 2])

Итак, хотя метод экземпляра определен как store(_ s: String), компилятор также неявно создает stati c вариант метода, который больше похож на static func store(_ self: MyClass) -> ((String)->()). Я не уверен, почему отладчик скажет вам, что f - это ()->() - это звучит как шутки и махинации Xcode.

Однако это свойство Swift имеет довольно интересные применения. См https://www.swiftbysundell.com/articles/first-class-functions-in-swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...