문자열에서 필터를 실행하고 싶습니다. 문자열이 자동으로 Character []로 변환되지 않아 첫 번째 시도가 실패했습니다.
var s: String = "abc"
s.filter { $0 != "b" }
다음 코드를 사용하여 서투르게 문자열을 Character []로 변환하면 예상대로 작동합니다. 그러나 확실히 깔끔한 방법이 있어야합니까?
var cs:Character[] = []
for c in s {
cs = cs + [c]
}
cs = cs.filter { $0 != "b" }
println(cs)
String
을 준수 CollectionType
프로토콜은, 그래서 당신의 기능 양식에 직접 전달할 수 있습니다 map
와 filter
전혀 변환하지 않고 :
let cs = filter(s) { $0 != "f" }
cs
여기입니다 Array
의 Character
들. 당신은으로 바꿀 수 String
사용하여 String(seq:)
을 구성 초기화, String
어떤에서 SequenceType
의 Character
들. ( SequenceType
모든 목록이 준수하는 프로토콜입니다. for
루프는 다른 여러 항목 중에서도 사용합니다.)
let filteredString = String(seq: cs)
물론 하나의 문장에이 두 가지를 쉽게 넣을 수 있습니다.
let filteredString = String(seq: filter(s) { $0 != "f" })
또는에있는 filter
것과 같은 편리한 메서드 를 만들려면 Array
확장을 사용할 수 있습니다.
extension String {
func filter(includeElement: Character -> Bool) -> String {
return String(seq: Swift.filter(self, includeElement))
}
}
( "Swift.filter"로 작성하므로 컴파일러 filter
는 현재 작성중인 메서드 를 재귀 적으로 호출하려고한다고 생각하지 않습니다 .)
필터링이 수행되는 방식을 숨기는 한 lazy를 사용하는 filter
것이 좋습니다. 이는 임시 배열 생성을 전혀 피해야합니다.
extension String {
func filter(includeElement: Character -> Bool) -> String {
return String(seq: lazy(self).filter(includeElement))
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다