2016-01-26 20 views
6

Tôi đã nhìn thấy điều này được thực hiện, nhưng tôi không thể quấn đầu của tôi xung quanh nó. Bằng cách nào đó, dường như một cách kỳ diệu, một số chức năng infix hoạt động tốt, nhưng những người khác chỉ đơn giản là sẽ không biên dịch. Ví dụ:Làm cách nào để viết các hàm Swift infix?

A function named "*" works fine, but one named "then" does not.

Như bạn thấy ở đây, công việc then chức năng của tôi như là một chức năng truyền thống, nhưng không phải là một trung tố một, nhưng * một của tôi có vấn đề ngược lại. Nước sốt ma thuật có chức năng then là gì?

Câu hỏi phụ: Tại sao chức năng * của tôi không hoạt động như một chức năng truyền thống?


Mã cho văn bản chỉ đọc và sao chép-dán:

public func * (let left:String, let right:Int) -> String { 
    if right <= 0 { 
     return "" 
    } 

    var result = left 
    for _ in 1..<right { 
     result += left 
    } 

    return result 
} 
*("Left", 6) // error: '*' is not a prefix unary operator 
"Left" * 6 // "LeftLeftLeftLeftLeftLeft" 

public func then (let left:String, let _ right:String) -> String { 
    return left + right 
} 
then("Left", "Right") // "LeftRight" 
"Left" then "Right" // 2 errors: Consecutive statements on a line must be separated by ';' 
+1

Tôi khuyên bạn nên xem xét tại đây https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html tại các nhà cung cấp dịch vụ. –

Trả lời

6

Các thư viện chuẩn Swift đã định nghĩa * như một nhà điều hành ghi:

infix operator * { 
    associativity left 
    precedence 150 
} 

Bạn sẽ tìm thấy danh sách các toán tử được xác định trước trong số Swift Standard Library Operators Reference. Ngoài ra, "nhấp vào lệnh" trên câu lệnh import Swift trong Xcode và tìm kiếm "toán tử".

Để sử dụng toán tử trong một "truyền thống" gọi hàm, bạn phải đặt nó bên trong dấu ngoặc đơn:

(*)("Left", 6) 

Nếu bạn muốn xác định điều hành ghi vào của riêng bạn, bạn cần phải thêm một tuyên bố infix operator. Tuy nhiên, lưu ý rằng chỉ một bộ giới hạn ký tự hợp lệ cho các toán tử (xem Language Reference->Lexical Structure->Operators để biết các quy tắc chính xác). Cụ thể, tên nhà điều hành phải có tên là (như @dfri đã nói) bắt đầu bằng /, =, -, +,!, *,%, <,>, &, |, ^,?, ~ Hoặc một số khác " biểu tượng "ký tự. Cụ thể, "sau đó" không phải là tên nhà điều hành hợp lệ.

+1

Câu trả lời hay. Ở đâu trong lib chuẩn của Swift là các toán tử infix được khai báo? Tôi rất thích làm qua các mô-đun và xem xét cách làm việc này. – JAL

+1

@JAL: Đối với các khai báo của chúng, hãy nhấp vào "Nhanh" trong 'nhập Swift', ví dụ: một sân chơi. – dfri

+1

@JAL: ... hoặc tại đây: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_StandardLibrary_Operators/index.html. –

2

* đã được xác định, tự nhiên, như một nhà điều hành ghi nhị phân trong Swift:

infix operator * { 
    associativity left 
    precedence 150 
} 

Do đó, bất kỳ chức năng của mẫu func * (... được sẽ được quá tải nhà điều hành ghi nhị phân này. Mặt khác, nếu bạn cố gắng sử dụng toán tử * làm toán tử unary, bạn sẽ nhận được lỗi mô tả "* không phải là toán tử tiền tố đơn", đơn giản là từ * không tồn tại nguyên bản làm tiền tố nhà điều hành.

Bạn dĩ nhiên có thể xác định riêng tiền tố của bạn hành *:

prefix operator * { } 
prefix func * (rhs: Int) -> Int { 
    return rhs*rhs 
} 

var a : Int = 2 
var b : Int = *a // 4 

Để quấn này: một số nhà khai thác tồn tại tự nhiên trong Swift vừa là tiền tố và ghi vào khai thác, ví dụ-

/* Declared natively in Swift */ 
infix operator - { 
    associativity left 
    precedence 140 
} 

prefix operator - { 
} 

/* Example usage */ 
let a : Int = 2 - 1 // 1, '-' infix operator used 
let b : Int = -1 // -1, '-' prefix operator used 

khi những người khác, chẳng hạn như *, chỉ là (natively) sử dụng như một nhà điều hành ghi.

Cũng lưu ý rằng nếu bạn muốn xác định các nhà khai thác tùy chỉnh ghi vào của riêng bạn, tên cho phép họ thường bị hạn chế như sau:

nhà khai thác tùy chỉnh có thể bắt đầu với một trong các ký tự ASCII /, =, -, + ,!, *,%, <,>, &, |, ^,? Hoặc ~ hoặc một trong các ký tự Unicode được định nghĩa trong ngữ pháp bên dưới (bao gồm các ký tự từ Toán tử toán học, Ký hiệu khác và Dingbats Unicode khối, trong số những người khác). Sau ký tự đầu tiên, việc kết hợp các ký tự Unicode cũng được cho phép.

Từ Language Reference - Lexical Structure.

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