Swift - получить ссылку на функцию с тем же именем, но с разными параметрами

Я пытаюсь получить ссылку на такую ​​функцию:

class Toto {
    func toto() { println("f1") }
    func toto(aString: String) { println("f2") }
}

var aToto: Toto = Toto()
var f1 = aToto.dynamicType.toto

У меня следующая ошибка: Ambiguous use of toto

Как получить функцию с указанными параметрами?


person Yaman    schedule 05.02.2015    source источник
comment
Обратите внимание, что aToto.dynamicType.toto возвращает каррированную функцию, принимающую экземпляр класса в качестве первого параметра, потому что вы ссылаетесь на него через его тип (aToto.dynamicType). Эквивалентом aToto.toto является Toto.toto(aToto) или aToto.dynamicType.toto(aToto).   -  person Antonio    schedule 05.02.2015


Ответы (1)


Поскольку Toto имеет два метода с одинаковыми именами, но разными сигнатурами, вам нужно указать, какой из них вы хотите:

let f1 = aToto.toto as () -> Void
let f2 = aToto.toto as (String) -> Void

f1()         // Output: f1
f2("foo")    // Output: f2

В качестве альтернативы (как правильно заметил @Antonio):

let f1: () -> Void     = aToto.toto
let f2: String -> Void = aToto.toto

Если вам нужны каррированные функции, принимающие экземпляр класса в качестве первого аргумента, вы можете действовать таким же образом, только подпись отличается (сравните комментарий @Antonios с вашим вопросом):

let cf1: Toto -> () -> Void       = aToto.dynamicType.toto
let cf2: Toto -> (String) -> Void = aToto.dynamicType.toto

cf1(aToto)()         // Output: f1
cf2(aToto)("bar")    // Output: f2
person Martin R    schedule 05.02.2015
comment
Что эквивалентно let f1: Void -> Void = aToto.toto и let f2: String -> Void = aToto.toto - person Antonio; 05.02.2015
comment
@ Антонио: Вы правы, спасибо. (На самом деле я попробовал это первым, но, должно быть, сделал какую-то ошибку, потому что изначально он не скомпилировался.) - person Martin R; 05.02.2015
comment
Нет ли разницы между aToto.toto и aToto.dynamicType.toto? Первый возвращает () -> Void, а второй возвращает Toto -> () -> Void. У меня есть библиотека, которая принимает второй тип в качестве параметра, поэтому я подумал, что мне нужно получить свою функцию с dynamicType вещами. Но aToto.dynamicType.toto as (String) -> Void возвращает следующую ошибку: String is not a subtype of Toto - person Yaman; 05.02.2015
comment
Верно ! Спасибо вам обоим за эти объяснения ;) - person Yaman; 05.02.2015
comment
@MartinR Знаете ли вы, как различать методы с одинаковыми типами параметров, но разными именами внешних параметров? Это может быть довольно распространенным явлением в случае методов делегата. Включение имени параметра в объявление типа не помогает. - person Stuart; 30.07.2015
comment
@Stuart: кажется, что это невозможно, сравните stackoverflow.com/questions/28284924/. - person Martin R; 30.07.2015