2014-06-10 17 views
6

Tôi muốn để tạo một tương đương Swift Phương pháp đểPhương pháp đặt tên Các vấn đề Swift

+ (void)insertFileWithService:(GTLServiceDrive *)service 
        title:(NSString *)title 

Khi tôi gõ

func insertFileWithService(service: GTLServiceDrive, 
    title title: String, 

tôi nhận được một danh hiệu danh hiệu cảnh báo có thể được diễn tả một cách ngắn gọn hơn như #title

Nhưng khi tôi đổi thành func insertFileWithService (dịch vụ: GTLServiceDrive, #title: Chuỗi

Tôi nhận được cảnh báo không liên quan '#' trong tiêu đề thông số đã là tên đối số từ khóa

Tôi có nên bỏ qua các cảnh báo này và bôi lên lỗi trong Beta không?

+0

Vì vậy, nếu bạn làm: ' func insertFileWithService (dịch vụ: GTLServiceDrive, #title: String) 'bạn nhận được cảnh báo đó? – Firo

+3

Đây có phải là một chức năng hay một phương pháp? Xem http://stackoverflow.com/a/24046893/390581 - chúng hoạt động khác nhau. –

+0

Vâng, tôi có thể tái tạo điều này nếu chức năng của một thành viên lớp chứ không phải toàn cầu. Ryan, bạn có thể muốn mở rộng câu hỏi của mình để hiển thị ví dụ hoàn chỉnh tối thiểu. Nhưng tôi muốn nói đó là lỗi Xcode. –

Trả lời

5

Tôi không tin rằng đây là một lỗi, trên thực tế, đây là cách ngôn ngữ được thiết kế để làm việc:


Từ Stuff của Apple (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-XID_300):

class Counter { 
    var count: Int = 0 
    func incrementBy(amount: Int, numberOfTimes: Int) { 
     count += amount * numberOfTimes 
    } 
} 

Số gia tăng này phương thức có hai tham số — số lượng và numberOfTimes. Theo mặc định, Swift xử lý số tiền dưới dạng tên cục bộ, nhưng xử lý numberOfTimes dưới dạng cả tên cục bộ và tên bên ngoài. Bạn gọi phương thức như sau:

let counter = Counter() 
counter.incrementBy(5, numberOfTimes: 3) 
// counter value is now 15 

Bạn không cần phải xác định một tên tham số bên ngoài cho giá trị đối số đầu tiên, bởi vì mục đích của nó là rõ ràng từ tên hàm incrementBy. Đối số thứ hai, tuy nhiên, là đủ điều kiện của một tên tham số bên ngoài để làm cho mục đích của nó rõ ràng khi phương pháp được gọi.

hành vi mặc định này có hiệu quả đối xử với phương pháp này, nếu như bạn đã viết một biểu tượng thăng (#) trước khi tham số numberOfTimes


Về cơ bản, cho Phương pháp bên trong một lớp học, tham số mặc định đầu tiên chỉ tên tham số nội bộ. Tất cả các tên tham số tiếp theo mặc định cho các tên bên ngoài, nơi tên bên ngoài là tên thông số theo mặc định. Do đó, # là không cần thiết.

func insertFileWithService(service: GTLServiceDrive, title: String) 

là tương đương với

func insertFileWithService(service: GTLServiceDrive, #title: String) 

Đối Phương pháp, không phải cho Chức năng. Đây là lý do tại sao bạn nhận được một cảnh báo.

+0

Tôi tìm thấy điều này trong cuốn sách “Nếu bạn muốn cung cấp tên tham số bên ngoài cho tham số hàm và tên tham số cục bộ đã là tên thích hợp để sử dụng, bạn không cần phải viết cùng tên hai lần cho tham số đó. Thay vào đó, hãy viết tên một lần và đặt tên cho nó bằng một biểu tượng băm (#). Điều này cho phép Swift sử dụng tên đó làm tên tham số cục bộ và tên tham số bên ngoài. ” Trích từ: Apple Inc." Ngôn ngữ lập trình Swift ". IBooks. https://itunes.apple.com/il/book/swift-programming-language/id881256329?mt=11 –

+0

Điều đó chỉ áp dụng cho các chức năng chứ không phải là phương pháp nếu tôi hiểu chính xác bạn –

+0

Đúng, báo giá bạn có là dành cho các chức năng không cho phương pháp. Đối với các phương thức, tên tham số cục bộ được giả định là tên tham số bên ngoài cho tất cả các tham số ngoại trừ tên tham số đầu tiên. Xem văn bản được trích dẫn từ bài đăng của tôi.Đối với các phương thức, # là ngầm định cho tham số thứ hai, đó là lý do tại sao bạn nhận được cảnh báo, việc thêm '#' là không cần thiết và trình biên dịch muốn bạn chắc chắn rằng bạn biết những gì bạn đang cố gắng thực hiện. – jacobhyphenated

0

Để lại dấu băm ra và chỉ cần sử dụng "title: String"

+0

Không, nó sẽ không. "title title: String" giống hệt với "title: String". – Bill

0

Swift cho phép bạn đặt tên cho lập luận khác nhau bên trong hàm hơn ra.

Bạn sẽ sử dụng các "Tên tham số ngoài" khi bạn muốn đối số có tên khác bên trong hàm. Từ the book:

Thỉnh thoảng hữu ích khi đặt tên cho mỗi thông số khi bạn gọi hàm, để cho biết mục đích của mỗi đối số bạn chuyển đến hàm .

Nếu bạn muốn người dùng của hàm cung cấp tên tham số khi họ gọi hàm của bạn, hãy xác định tên thông số bên ngoài cho mỗi tham số , ngoài tên thông số cục bộ.

Vì bạn đang sử dụng cùng tên cả trong nội bộ một bên ngoài ở đây, "title", bạn có thể bỏ qua tên thông số bên ngoài như Swift gợi ý và sử dụng tiền tố # để biểu thị một thông số bên ngoài được đặt tên có cùng tên tham chiếu trong nội bộ.

Ví dụ từ cuốn sách:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool { 
    for character in string { 
     if character == characterToFind { 
      return true 
     } 
    } 
    return false 
} 
+0

Ví dụ này sẽ đưa ra lỗi, "Bên ngoài '#' trong tham số: 'characterToFind' đã là tên đối số từ khóa" tại thời điểm viết. – Gomfucius

0

Tên phương pháp của bạn như vậy:

@objc(insertFileWithService:title:) 
func insertFile(service: GTLServiceDrive, title: String) 

Sau đó từ Swift, gọi nó là như vậy:

obj.insertFile(serviceDrive, title: "Title") 

Và trong Objective C:

[obj insertFileWithService:serviceDrive title: @"Title"]; 
+0

Tại sao chú thích '@ objc' ở đây? Chỉ cần chú thích lớp ('@objc class ...'). –

+0

@ Jean-PhilippePellet Chú thích là cung cấp cho nó một tên thân thiện với mục tiêu C hơn, mà không làm cho tên Swift khó xử. –

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