2016-01-07 19 views
9

Khi tôi cmd nhấp vào chức năng chia tách trong Xcode, nó sẽ đưa tôi đến tệp tiêu đề. Đây là nội dung được đọcCách đọc các tiêu đề nhanh chóng

public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence] 

Cách triển khai sau hoạt động với tuyên bố trên?

someString.characters.split { $0 == "." } 

Trả lời

5

Hãy phá vỡ nó xuống:

public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence] 

maxSplit: Tham số đầu tiên, maxSplit, cho phép bạn xác định số lượng tối đa miếng mà trình tự sẽ được chia thành. Giá trị mặc định là Int.max.

allowEmptySlices: Tham số thứ hai, allowEmptySlices chỉ định xem hai dấu tách liên tiếp trong chuỗi có dẫn đến lát trống không. Giá trị mặc định là false. Ví dụ: nếu bạn có một Chuỗi, "A..B" và bạn chia thành các ký tự ., bạn có thể kết thúc với hai mục (["A", "B"]) hoặc ba (["A", "", "B"]) trong mảng đầu ra tùy thuộc vào những gì bạn chuyển cho tham số này.

isSeparator: Thông số cuối cùng là đóng cửa mà bạn vượt qua để xác định vị trí tách chuỗi.

Vì cả hai maxSplitallowEmptySlices đều có đối số mặc định, bạn không cần phải đưa chúng vào cuộc gọi chức năng của mình trừ khi bạn muốn thay đổi chúng. Thông số duy nhất mà bạn phải cung cấp là đóng cửa isSeparator.

Trong trường hợp của bạn, bạn gọi:

someString.characters.split { $0 == "."} 

... đó là tương đương với:

someString.characters.split(maxSplit: Int.max, allowEmptySlices: false) { $0 == ".' } 

Bạn cũng có thể viết lời gọi hàm của bạn như thế này:

someString.characters.split(isSeparator: { $0 == "." }) 

Cách mà bạn đã viết nó sử dụng cú pháp "đóng dấu sau". Nếu một hàm có một kết thúc như đó là tranh luận cuối cùng, bạn có thể chuyển việc đóng cửa ngoài ngoặc như thế này:

someString.characters.split() { $0 == "." } 

Và nếu chức năng mất chỉ có một lập luận (không kể bất kỳ đối số mặc định mà bạn đang không cung cấp) thì bạn có thể bỏ qua các dấu ngoặc hoàn toàn:

someString.characters.split { $0 == "." } 

Ở cấp độ cao nhất, những gì xảy ra là split lặp thông qua một chuỗi các ký tự. Nó kiểm tra từng ký tự bằng cách sử dụng đóng cửa được cung cấp, và nếu đóng cửa trả về true, nó tách chuỗi trên ký tự đó. Trong trường hợp của bạn, nó sẽ phân chia chuỗi ký tự mỗi khi nó nằm trong một số ".".

Một số lưu ý khác:

rethrows: Toàn bộ chức năng được đánh dấu rethrows. Nó sẽ ném một lỗi, nhưng chỉ khi đóng cửa mà bạn vượt qua cho đối số isSeparator ném một lỗi chính nó. Lưu ý rằng tham số isSeparator cho phép bạn vượt qua một kết thúc có thể gây ra lỗi, nhưng bạn không phải làm như vậy. Bất cứ lúc nào một hàm chấp nhận một đóng mà ném một lỗi, nó cũng sẽ chấp nhận một đóng mà không ném. Điều này là do các chức năng không ném là một loại chức năng ném phụ.

@noescape: Thông số isSeparator được đánh dấu @noescape. Điều đó chỉ đơn giản có nghĩa là không có gì trong việc đóng cửa sẽ tồn tại qua cuối cuộc gọi đến split.

5

dòng của bạn someString.characters.split { $0 == "."} sử dụng các giá trị mặc định cho maxSplitallowEmptySlices và chỉ định một đóng tùy chỉnh cho isSeparator. Một số phiên bản dài hơn gọi hàm split là:

let arr = str.characters.split(Int.max, allowEmptySlices: false) { (char) -> Bool in 
    char == "." 
} 

Kể từ mã trên sử dụng các giá trị tương tự như giá trị mặc định thực tế (Int.maxfalse), bạn có thể loại bỏ hai tham số đầu tiên và kể từ khi đóng cửa là người cuối cùng tham số (làm cho nó một đóng dấu), bạn có thể bỏ qua toàn bộ thông số và chỉ cần viết một kết thúc theo cách sau:

let arr = str.characters.split { (char) -> Bool in 
    char == "." 
} 

Bây giờ chúng ta có thể đơn giản hóa việc đóng cửa bằng cách bỏ chữ ký cụ thể:

let arr = str.characters.split { $0 == "." } 
2
someString.characters.split { $0 == "."} 

tương đương với

someString.characters.split(isSeparator: { $0 == "."}) 

việc đóng cửa trong mã của bạn được gọi là một trailing closure, đóng cửa mà là tham số cuối cùng để một chức năng có thể được đặt sau phần khai báo hàm, và nếu không có khác các tham số còn lại, bạn cũng có thể bỏ qua ().

Hai tham số đầu tiên có giá trị mặc định, vì vậy chúng có thể được bỏ qua, dẫn đến cuộc gọi đơn giản mà bạn đã đăng.

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