2015-01-28 8 views
1

따라서 Foundation을 사용하면 NSCharacterSet을 사용하여 문자 집합을 정의하고 문자열의 문자 구성원을 테스트 할 수 있습니다. 저는 코코아 수업없이 그렇게하고 싶습니다. 순전히 신속한 방식으로하고 싶습니다.사용자 지정 PURE 스위프트 문자 집합 정의

이상적으로, 코드과 같이 사용될 수있다 :

struct ReservedCharacters: CharacterSet { 
    characters "!", "#", "$", "&", ... etc. 

    func isMember(character: Character) -> Bool 

    func encodeCharacter(parameters) { accepts a closure } 

    func decodeCharacter(parameters) { accepts a closure } 
} 

이 아마 매우로드 질문입니다. 하지만 당신이 생각하는 것을보고 싶습니다.

답변

2
이미 문자열을 초기화하고 contains 전역 함수를 사용하여 문자 세트에 회원 가입을 테스트 할 수 있습니다

: 당신은 단지 8을 얻기 위해 노력하고있다, 지금까지 당신의 encodedecode 기능을 가서

let vowels = "aeiou" 

let isVowel = contains(vowels, "i") // isVowel == true 

을 문자에 대한 16 비트 또는 16 비트 인코딩 이런 경우 다음 단지 문자열과이 액세스 utf8 또는 utf16 속성으로 변환 : ...

let char = Character("c") 

let a = Array(String(char).utf8) 
println()   // This prints [99] 

Decode 좀 더 많은 작업을 것입니다,하지만 난 그것을 위해 함수가 알고

편집 : 이것은 문자의 16 진수 값 다음에 '%'와 characterSet에서 문자를 대체 할이 :

let encode: String -> String = { s in 
    reduce(String(s).unicodeScalars, "") { x, y in 
     switch contains(charSet, Character(y)) { 
     case true: 
      return x + "%" + String(y.value, radix: 16) 
     default: 
      return x + String(y) 
     } 
    } 
} 

let badURL = "http://why won't this work.com" 
let encoded = encode(badURL) 
println(encoded) // prints "http://why%20won%27t%20this%20work.com" 

디코딩, 다시 조금 더 도전이지만, 나는 그것을 할 수 있습니다 확신합니다 ...

+0

그래서이 응용 프로그램은 URL/URI 인코딩에 있습니다. contains() 함수는 isMember에서 잘 작동하지만 "번역"또는 문자열의 퍼센트 인코딩으로 문자열을 인코딩하려면 문자열의 특정 문자를 변경해야합니다. 예를 들어, "!" -> "% 21" 문자 집합을 사용하는 것은 편리 할 수 ​​있습니다. 그 이유는 멤버십은 집합의 특정 문자를 정의하여 테스트 할 수 있고 클로저 또는 외부 함수를 통해 인코딩을 수행 할 수 있기 때문입니다. – Sean

+0

아, 알겠습니다. 나는 내 대답을 편집 할 것이다. –

+0

이것은 훌륭한 구현입니다! 나는 캐릭터의 문자열이 아닌 방법으로 멤버쉽을 테스트 할 수있는 방법을 찾고 있었지만 그렇게 할 것입니다. 필요한 경우 해당 래퍼를 제공 할 수있는 방법을 찾을 수 있습니다. – Sean