Swift 의 Substring 과 String 을 깊이 이해 합 니 다.

4799 단어 swiftstringsubstring
머리말
텍스트 문자열 에 특성 이나 문법 설탕 을 추가 하 는 것 은 각종 프로 그래 밍 언어 에서 흔 하 다.모두 가 잘 아 는 C 언어 를 예 로 들 면 C 문자열 의 본질은 문자 배열(characters array)이지 만 문자열 을 입력 할 때마다[h','e','l','l','o']를 입력 하지 않 고 hello 를 직접 치면 됩 니 다.이 조작 컴 파일 러 가 해 주 었 기 때 문 입 니 다.
더 높 은 언어,예 를 들 어 Swift 처리 문자열 은 문자 배열 이 아니 라 String 은 완전한 형식 이 며 여러 가지 특성 이 있 습 니 다.먼저 String 의 특성 을 살 펴 보 겠 습 니 다:substring.
간단하게 String 을 볼 게 요.
우선 문자열 의 실현 을 대충 알 아 보 세 요.다음 코드 는 표준 라 이브 러 리 에서 String.swift:

public struct String {
 public var _core: _StringCore
}
물론 다른 초기 화 설정 도 있 지만 성명 에는 이 저장 속성 만 있 습 니 다!비밀 은 틀림없이 StringCore.swift 에 있 을 것 이다.

public struct _StringCore {
 public var _baseAddress: UnsafeMutableRawPointer?
 var _countAndFlags: UInt
 public var _owner: AnyObject?
}
이 유형 에는 또 많은 다른 것들 이 있 지만 우 리 는 저장 속성 에 만 관심 을 가진다.
Base address―내부 저장 소 를 가리 키 는 지침
  • Count-문자열 길이,UInt 형식 은 64 비트 시스템 에서 62(64-2)비트 의 공간 이 길 이 를 나 타 낼 수 있다 는 것 을 의미한다.이것 은 매우 큰 숫자 다.그래서 문자열 의 길이 가 넘 칠 수 없습니다
  • 4.567917.Flags-두 개의 bits 를 표지 로 한다.첫 번 째 는StringBuffer 소지;두 번 째 는 인 코딩 형식 이 ASCII 인지 UTF-16 인지 표시 합 니 다_StringCore 의 실제 상황 은 여기 서 언급 한 것 보다 훨씬 복잡 하지만 위의 내용 을 통 해 문자열 의 일부 정 보 를 쉽게 이해 할 수 있 습 니 다.문자열 의 내부 저장 과 저장 크기(underlying storage and size).
    Substring
    Swift 에서 substring 을 어떻게 만 듭 니까?가장 쉬 운 방법 은 아래 표 시 를 통 해 string 에서 한 단락 을 추출 하 는 것 이다.
    
    let str = "Hello Swift!"
    let slice = str[str.startIndex..
    <str index="" str="" startindex="" nbsp="" offsetby:="" 5="" hello=""></str>
    간단 하지만 코드 가 우아 해 보이 지 않 습 니 다.
    String 의 색인 은 직관 적 인 정형 이 아니 므 로 캡 처 할 때의 위치 색인 은 startIndex 와 index(:offsetby:)가 져 옵 니 다.문자열 의 시작 위치 에서 캡 처 하면 startIndex 를 생략 할 수 있 습 니 다.
    
    let withPartialRange = str[..
    <str index="" str="" startindex="" nbsp="" offsetby:="" 5="" still="" hello=""></str>
    혹은 collection 의 이 방법 으로:
    
    let slice = str.prefix(5)
    // still "Hello"
    문자열 도 collection 이라는 것 을 기억 해 야 하기 때문에 prefix(),suffix(),dropFirst()등 집합 적 인 방법 을 사용 할 수 있 습 니 다.
    Substring 의 내부 원리
    substring 의 신기 한 점 은 그들 이 부모 string 의 메모 리 를 다시 사용 한 것 이다.너 는 substring 을 아버지 string 의 한 단락 으로 이해 할 수 있다.

    예 를 들 어 8000 글자 의 문자열 에서 100 자 를 캡 처 하면 100 글자 의 메모리 공간 을 다시 초기 화 할 필요 가 없습니다.
    이것 은 또한 네가 부주의 로 부모 string 의 생명 주 기 를 연장 할 수도 있다 는 것 을 의미한다.큰 문자열 이 있 으 면 작은 문자열 만 캡 처 했 을 뿐,캡 처 한 작은 문자열 이 풀 리 지 않 으 면 큰 문자열 도 풀 리 지 않 습 니 다.
    Substring 내 부 는 어떻게 하 는 거 죠?
    
    public struct Substring {
     internal var _slice: RangeReplaceableBidirectionalSlice
    <string></string>
    내부 의slice 속성 은 부모 문자열 에 대한 모든 정 보 를 저장 합 니 다:
    
    // Still inside Substring
    internal var _wholeString: String {
     return _slice._base
    }
    public var startIndex: Index { return _slice.startIndex }
    public var endIndex: Index { return _slice.endIndex }
    계산 속성wholeString(전체 부모 문자열 을 되 돌려 줍 니 다),startIndex 와 endIndex 는 내부 의slice 복귀.
    slice 가 부모 문자열 을 어떻게 인용 하 는 지 알 수 있 습 니 다.
    Substring 을 String 으로 변환
    마지막 코드 에는 substring 이 많 을 수 있 지만 함수 의 매개 변수 유형 은 string 이 필요 합 니 다.Substring 을 string 으로 변환 하 는 과정 도 간단 합 니 다.
    
    let string = String(substring)
    substrings 는 부모 문자열 과 같은 메모리 공간 을 공유 하기 때문에 새 문자열 을 만 들 면 새로운 저장 공간 을 초기 화 할 것 으로 예상 합 니 다.그럼 string 의 초기 화 과정 은 어떤 것 일 까요?
    
    extension String {
     public init(_ substring: Substring) {
     // 1
     let x = substring._wholeString
     // 2
     let start = substring.startIndex
     let end = substring.endIndex
     // 3
     let u16 = x._core[start.encodedOffset..
    <end encodedoffset="" nbsp="" 4a="" if="" start="" sameposition="" in:="" x="" unicodescalars="" end="" self="" 4b="" else=""></end>
    4
  • 기 존 부모 문자열 에 대한 인용 을 만 듭 니 다
  • 부모 문자열 에서 substring 의 시작 과 끝 위 치 를 가 져 옵 니 다
  • UTF-16 형식의 substring 내용 을 가 져 옵 니 다.core 는StringCore 의 인 스 턴 스 입 니 다
  • 일치 하 는 유 니 코드 인 코딩 을 판단 하고 새로운 문자열 인 스 턴 스 를 생 성 합 니 다
  • substring 을 string 으로 바 꾸 는 절 차 는 매우 간단 하지만,당신 은 이렇게 해 야 하 는 지 아 닌 지 를 고려 해 야 할 수도 있 습 니 다.substring 작업 을 할 때 유형 이 string 이 라 고 요구 하 는 거 아니에요?substring 에 대한 작업 이 string 으로 바 뀌 어야 한다 면 경량급 substring 도 의 미 를 잃 게 됩 니 다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기