Swift 의 Substring 과 String 을 깊이 이해 합 니 다.
텍스트 문자열 에 특성 이나 문법 설탕 을 추가 하 는 것 은 각종 프로 그래 밍 언어 에서 흔 하 다.모두 가 잘 아 는 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―내부 저장 소 를 가리 키 는 지침
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총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백그라운드에서 값을 계산하고 Swift 동시성 이후에 결과 사용값을 계산해야 하고 메인 스레드를 차단하지 않으려면 계산된 값을 반환하는 Swift Task 구조에서 해당 값을 계산하면 됩니다. Swift 동시성 이전에는 백그라운드 대기열로 이동하여 필요한 값을 계산하고 필요한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.