swift3에서 (문자열) 고정 길이 분할

11216 단어 SwiftSwift3.0문자열

소개



이전 swift2에서 구현하고 있던 것을 swift3.0에 이식하는데 있어서, 조금 빠진, 수정 이력으로서 남겨 두려고 생각한다.

이전 기사는 여기> swift2에서 고정 길이 분할

전치



왜 이러한 구현이 필요한지에 대해서는 특별히 대답 할 계획이 없으며, 일반 상황에서만.

참고로 한 페이지



결국 에러 메세지가 제일 참고가 됩니다만, 그 메세지를 바탕으로, 어떻게 고치는가 하는 부분에서 참고로 하고 있습니다.
- swift migration guid
- apple-api-reference: stride function
- apple-api-reference: string function
- blog: ranges
- blog: strings

변한 부분



짧은 코드에 비해 바뀐 부분이 상당히 있었습니다.
- 스트라이드
- AdvancedBy
- joinWithSeparator

스트라이드



이것은 stride(to )가 없어져 stride(from by:)로 대체해야 했습니다.swift:String+Splitter.swift
0.stride(to: limit, by: len).forEach {
이것이 다음과 같습니다.swift:String+Splitter.swift
stride(from: 0, to: limit, by: len).forEach {

advancedBy



index로 열심히

joinWithSeparator



joined(separator:)로 바뀌었습니다.

우선 코드를 올려



String+Spritter.swift


extension String {

  /** 文字列を固定長で分割する
  - Parameter len: 分割する長さ
  - Parameter handle: 分割ごとに呼び出される
  */
  public func Splitter(_ len: Int, handle: ((_ cut: String, _ isLast: Bool)->())) {
  {
    let limit = self.characters.count
    stride(from: 0, to: limit, by: len).forEach {
      p in
      guard let st = self.index(startIndex,offsetBy:p, limitedBy: endIndex)
         else {
            handle("",true)
            return
         }
      guard let end = self.index(st, offsetBy: len, limitedBy: endIndex)
         else {
            let cut = self.substring(from: st)
            handle(cut,true)
            return
         }
      let cut = self.substring(with: st..<end)
      handle(cut, end == endIndex)
    }
  }

}

다시 작성



이전 코드보다 실행 시간이 느려져 버렸습니다. 이전 코드와 가능한 한 비슷하게 보겠습니다.

String+Spritter.swift
  /** 文字列を固定長で分割する
  - Parameter len: 分割する長さ
  - Parameter handle: 分割ごとに呼び出される
  */
    public func Splitter(len: Int, handle: ((_ cut: String, _ isLast: Bool)->())) {
        let array = self.characters.map { String($0) }
        let limit = self.characters.count
        stride(from: 0, to: limit, by: len).forEach {
            p in
            guard let st = array.index(array.startIndex,offsetBy:p, limitedBy: array.endIndex)
                else {
                    handle("",true)
                    return
                }
            guard let end = array.index(st, offsetBy: len, limitedBy: array.endIndex)
                else {
                    let cut = array[st..<array.endIndex].joined()
                    handle(cut,true)
                    return
            }
            let cut = array[st..<end].joined()
            handle(cut, end == array.endIndex)
        }
    }

이로 인해 이전보다 빠르게 작동합니다. array가 빈번하고 있는 것이 신경쓰지 않지만. . .
substring보다 분해하여 joined하는 것이 빠른 것은 swift의 내부 구현 때문일까.

좋은 웹페이지 즐겨찾기