2017-04-25 17 views
5

Tôi có một lớp trong nhanh chóng với biến sau đây:Swift: gán chức năng để biến

var pendingFunction = ((Double, Double) -> Double) 

Swift sau đó nói với tôi:

Expected member name or constructor call after type name

Nó khẳng định rằng tôi thay đổi mã của tôi để:

var pendingFunction = ((Double, Double) -> Double).self 

Tôi không biết đầu mối này là gì .self đang làm (xin lỗi tôi mới đến Swift)

sau đó tôi cố gắng phân pendingFunction đến một chức năng mới:

pendingFunction = function 

nơi function mất hai giường đôi và trả về một đôi.

Tuy nhiên, tôi đang trình bày với các lỗi sau:

Cannot assign value of type '(Double,Double) -> Double' to type '((Double,Double)->Double).Type'

Vì vậy, câu hỏi của tôi là: .self điều làm là gì và làm thế nào tôi có thể gán đúng một chức năng để biến?

+5

Bạn sẽ muốn 'var pendingFunction: ((Double, Double) -> Double)' để khai báo một biến kiểu hàm. –

+1

'var pendingFunction: ((Double, Double) -> Double) = {firstDouble, secondDouble in/* làm bạn ở đây * /}' sau đó gọi nó là 'let resultDouble = pendingFunction (double1, double2)' – ObjectAlchemist

+1

, điều đó có nghĩa là bạn chỉ định loại hàm, chứ không phải là hàm thực tế. Ví dụ, 'var someInt: Int' có nghĩa là bạn sẽ gán một giá trị Int cụ thể cho nó, trong khi' var someInt = Int.self' có nghĩa là bạn đang sử dụng nó để đại diện cho kiểu Int như một toàn thể. –

Trả lời

10

Biểu thức post2 .self chỉ đề cập đến đối tượng đó là một thể hiện của. Loại giống như .this bằng các ngôn ngữ khác. Đối với các loại cụ thể, nó cho trình biên dịch biết rằng bạn đang đề cập đến chính loại đó, thay vì chỉ dẫn nó để tạo một thể hiện mới của kiểu đó. Nếu bạn muốn biết thêm, bạn có thể đọc tất cả về nó trong tài liệu here. Trong khi hữu ích trong nhiều trường hợp, nó không thực sự cần thiết ở đây.

Đối với vấn đề của bạn, khi bạn gán:

var pendingFunction = ((Double, Double) -> Double).self 

Bạn đang gán loại của một loại đặc biệt của hàm làm giá trị của biến. Từ đó, Swift cho rằng loại loại của biến phải là Type. Sau đó, khi bạn cố gắng gán một hàm thực tế phù hợp với kiểu đó làm giá trị, nó sẽ ném một lỗi vì nó mong đợi một kiểu, không phải là một hàm.

Thay vì gán một kiểu như là giá trị, bạn muốn khai báo biến với kiểu đó as type của nó:

var pendingFunction: ((Double, Double) -> Double) 

Dưới đây là một ví dụ về toàn bộ sự việc:

var pendingFunction: ((Double, Double) -> Double) 

func myAdditionFunction (first: Double, second: Double) -> Double { 
    return first + second 
} 

pendingFunction = myAdditionFunction 

print(pendingFunction(1,2)) // prints "3.0" 
Các vấn đề liên quan