2015-02-02 18 views
6

Tôi nhận được một lỗi thời gian biên dịch mà tham chiếu myFunc không rõ ràng.Swift - Gán Chức năng Quá tải cho Biến

func f (s: String) -> String { return "version 1: " + s } 
func f(sourceString s: String) -> String { return "version 2: " + s } 
var myFunc: (String)-> String = f as (sourceString : String)->String 

Làm cách nào tôi có thể tham chiếu rõ ràng từng phiên bản của hàm bị quá tải, f, trong ví dụ trên? Nếu tôi nhận xét hoặc tuyên bố của func f nó sẽ biên dịch và làm việc. Nhưng tôi muốn biết cách tham chiếu từng chức năng nếu cả hai được khai báo. Cảm ơn.

+0

Hãy cho tôi biết Nếu câu trả lời của tôi đã giúp bạn. Tôi có thể cố gắng giúp đỡ nhiều hơn –

Trả lời

4

Điều thú vị này. Tôi không nghĩ rằng điều đó có thể xảy ra nếu không thực hiện điều gì đó theo đề xuất của @ marcos. Vấn đề bạn là bạn có thể “ném” các tên trong các bộ:

let named_pair = (s: "hello", i: 1) 
named_pair.s // hello 

let anon_pair = named_pair as (String,Int) 
// or anon_pair: (String,Int) = named_pair, if you prefer 
anon_pair.s // no such member 's' 

Bây giờ giả sử bạn xác định hai chức năng, giống hệt nhau ngoại trừ lý lẽ ai đã đặt tên:

func f(s: String, i: Int) { println("_: \(s)") } 
func f(#s: String, #i: Int) { println("s: \(s)") } 

Sau đó, bạn có thể gọi nó qua tuples với tên vs luận giấu tên:

f(named_pair) // prints s: hello 
f(anon_pair) // prints _: hello 

// but if you try to call a named argument function with unnamed tuples: 
func g(# s: String, # i: Int) { println("s: \(s)") } 
g(anon_pair) // compiler error 

let h = g 
h(anon_pair) // compiler error 
h(named_pair) // works 

Nhưng bởi vì bạn có thể bỏ đi những cái tên bạn có thể làm điều này:

// compiles and runs just fine... 
(g as (String,Int)->())(anon_pair) 
let k: (String,Int)->() = g 
// as does this 
k(anon_pair) 

Và khả năng này để làm điều này có nghĩa là không thể sử dụng loại để phân biệt một hàm bị quá tải chỉ bởi tên đối số, theo như tôi có thể nói.

+0

Cảm ơn bạn đã trả lời chu đáo. Thảo luận tuyệt vời về điều này bởi tất cả. Tốc độ bay - Tôi sợ điều đó. Không nhiều từ góc độ thực tế (tôi luôn có thể đổi tên hàm để tránh quá tải), nhưng nhiều hơn từ góc độ học tập.Dường như một loại người nghèo mà một ngôn ngữ hỗ trợ các chức năng như các kiểu dữ liệu hạng nhất có các kịch bản mà ở đó người ta không thể tham khảo một cách rõ ràng các hàm bị quá tải. Ok - học giả trong tôi thất vọng, nhưng người thực dụng sẽ thừa nhận điều này có thể sẽ không bao giờ xuất hiện trong "đời thực" :-) –

+0

Một cách tiếp cận khác mà tôi đã nghĩ là khai báo thứ hai là một đóng cửa được gán cho biến ban đầu. Điều đó cũng sẽ làm việc, nhưng một lần nữa, tôi đã thực sự hy vọng ngôn ngữ có một cách để tham khảo một chữ ký hàm bao gồm định nghĩa tham số. –

1
  • Số đối số sẽ thay đổi.
  • Nếu số lượng đối số giống nhau thì loại dữ liệu của chúng phải là khác nhau.

Ví dụ

 
func f(x : String) -> NSString { 
     return a 
    } 
func f(x : UInt) -> NSString { 
      return "{\(x)}" 
     } 
+3

Không nhất thiết. Các hàm trong Swift chỉ được phép khác nhau bởi các tên tham số bên ngoài. –

+0

Cảm ơn @IvicaM. Tôi không biết điều đó. –

0

Tôi không nghĩ rằng bạn có thể. Bạn có thể gọi một hay khác:

println(f("test")) // version 1: test 
println(f(sourceString: "test")) // version 2: test 
+0

Cảm ơn, Ivica. Tôi không có vấn đề gì khi gọi từng chức năng. Nhưng tôi muốn một tham chiếu biến cho mỗi thay vào đó (các hàm như các kiểu hạng nhất, nên có thể trỏ một biến cho mỗi hàm một cách rõ ràng). –

5

Tôi không biết làm thế nào để thực hiện chính xác những gì bạn muốn, nhưng có lẽ điều này giúp:

var myFunc1: (String)-> String = { s in f(sourceString: s) } 
var myFunc2: (String)-> String = { s in f(s) } 

Bây giờ bạn có thể gọi:

let s1 = myFunc1("one") // returns "version 2: one" 
let s2 = myFunc2("two") // returns "version 1: two" 
+0

Cảm ơn bạn đã trả lời, Marcos. Tôi đồng ý bởi không quá tải, tôi tránh vấn đề này. Tôi quan tâm nhiều hơn đến cách tôi có thể chỉ định một chữ ký hàm cụ thể khi sự khác biệt duy nhất nằm trong các tham số được đặt tên. Quan tâm của tôi là càng nhiều học thuật (kể từ khi công việc xung quanh bạn đề cập đến sẽ làm việc). Có cách nào để phân biệt tham chiếu hàm ngoài tên riêng biệt không? –

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