Как Swift решает, какую функцию выполнять, если функции похожи? - PullRequest
0 голосов
/ 02 июля 2018

Как две приведенные ниже функции, какую функцию Swift выполнит первой?

Есть ли образец этого?

Потому что я столкнулся с двумя более сложными функциями, чем эта. Сначала выполняется «Любой», независимо от того, какой порядок я им делаю (потому что я предполагаю, что он выполняется с адреса памяти, но, похоже, нет).

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

Интересно, почему и как это происходит или где я могу получить ответ.

import UIKit

func add(_ x: Int,_ y: Any) -> Int {
    return 3
}

func add(_ a: Int,_ b: Int) -> Int {
    return 1
}

print(add(2, 3))
// "1\n"

print(add(2, "3"))
// "3\n"

вот мой другой случай:

let constraint = titleLabel.layout(.width, .lessThanOrEqual, 122)

это то, что я ожидаю выполнить:

func layout(_ attribute: NSLayoutAttribute, _ relatedBy: NSLayoutRelation, _ constant: CGFloat, active: Bool = true, priority: UILayoutPriority = .init(1000)) -> NSLayoutConstraint {}

но на самом деле он выполняет это:

func layout(_ attribute: NSLayoutAttribute, _ relatedBy: NSLayoutRelation, _ toItem: Any?, active: Bool = true, priority: UILayoutPriority = .init(1000)) -> NSLayoutConstraint {}

если swift выбирает наиболее конкретный вариант, разве он не должен выполнять "Float"?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Компилятор Swift выбирает сигнатуру функции, которая соответствует вызову, который вы делаете.

Когда вы вызываете add с двумя Int аргументами, он видит, что есть функция add с двумя Int параметрами, поэтому он вызывает ее.

Когда вы вызываете add с Int и String, он сначала ищет такую ​​функцию, но ее нет. Затем он видит, что есть один с Int и Any. Поскольку Any может соответствовать любому типу, он соответствует. Так что это называется.

Это нечто большее, но это достаточно хорошее обобщение для вашего вопроса.

0 голосов
/ 02 июля 2018

Похоже, что он настолько конкретен, насколько может.

Он вызывает add (int, int), когда это возможно, и отступает, чтобы добавить (int, any), когда это необходимо.

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