2015-02-05 17 views
5

Tôi đang cố gắng để có được một tham chiếu đến một chức năng như vậy:Swift - được tham chiếu đến một hàm với cùng một tên nhưng thông số khác nhau

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

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

Tôi đã được lỗi sau: Ambiguous use of toto

thế nào Tôi nhận được chức năng với các thông số được chỉ định?

+0

Lưu ý rằng 'aToto.dynamicType.toto' trả về một hàm cà ri lấy một ví dụ lớp như tham số đầu tiên của nó, bởi vì bạn đang tham chiếu nó thông qua loại của nó (' aToto .dynamicType'). Tương đương với 'aToto.toto' là' Toto.toto (aToto) 'hoặc' aToto.dynamicType.toto (aToto) ' – Antonio

Trả lời

9

Kể từ Toto có hai phương pháp có cùng tên nhưng chữ ký khác nhau, bạn phải xác định cái nào bạn muốn:

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

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

Ngoài ra (như @Antonio ghi nhận một cách chính xác):

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

Nếu bạn cần các hàm curried lấy một thể hiện của lớp là đối số đầu tiên sau đó bạn có thể tiến hành theo cùng một cách, chỉ chữ ký là khác nhau (so sánh bình luận @Antonios cho câu hỏi của bạn):

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

cf1(aToto)()   // Output: f1 
cf2(aToto)("bar") // Output: f2 
+0

Tương đương với' let f1: Void -> Void = aToto.toto' và 'let f2 : String -> Void = aToto.toto' – Antonio

+0

@Antonio: Bạn nói đúng, cảm ơn. (Trên thực tế tôi đã cố gắng đầu tiên nhưng phải có một số lỗi, bởi vì nó không biên dịch ban đầu.) –

+0

Không có sự khác biệt giữa 'aToto.toto' và' aToto.dynamicType.toto'? Đầu tiên trả về một '() -> Void' trong khi thứ hai trả về' Toto ->() -> Void'. Tôi có một lib mà có loại thứ hai là tham số vì vậy tôi nghĩ rằng tôi cần thiết để có được func của tôi với công cụ 'dynamicType'. Nhưng 'aToto.dynamicType.toto là (String) -> Void' trả về lỗi sau:' String không phải là một kiểu con của Toto' – Yaman

Các vấn đề liên quan