swift3에서 (문자열) 고정 길이 분할
소개
이전 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의 내부 구현 때문일까.
Reference
이 문제에 관하여(swift3에서 (문자열) 고정 길이 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/to_obara/items/ba1b3c696d5071792a11
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
0.stride(to: limit, by: len).forEach {
stride(from: 0, to: limit, by: len).forEach {
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)
}
}
}
/** 文字列を固定長で分割する
- 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)
}
}
Reference
이 문제에 관하여(swift3에서 (문자열) 고정 길이 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/to_obara/items/ba1b3c696d5071792a11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)