Swift에서 "Index"를 "Int" 유형으로 변환하는 방법은 무엇입니까?
문자열에 포함된 문자의 인덱스를 정수 값으로 변환하려고 합니다.헤더 파일을 읽으려고 했지만 다음 유형을 찾을 수 없습니다.Index
비록 그것이 프로토콜에 부합하는 것처럼 보이지만.ForwardIndexType
방법(예:distanceTo
).
var letters = "abcdefg"
let index = letters.characters.indexOf("c")!
// ERROR: Cannot invoke initializer for type 'Int' with an argument list of type '(String.CharacterView.Index)'
let intValue = Int(index) // I want the integer value of the index (e.g. 2)
어떤 도움이든 감사합니다.
편집/업데이트:
Xcode 11 • Swift 5.1 이상
extension StringProtocol {
func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }
func distance<S: StringProtocol>(of string: S) -> Int? { range(of: string)?.lowerBound.distance(in: self) }
}
extension Collection {
func distance(to index: Index) -> Int { distance(from: startIndex, to: index) }
}
extension String.Index {
func distance<S: StringProtocol>(in string: S) -> Int { string.distance(to: self) }
}
운동장 테스트
let letters = "abcdefg"
let char: Character = "c"
if let distance = letters.distance(of: char) {
print("character \(char) was found at position #\(distance)") // "character c was found at position #2\n"
} else {
print("character \(char) was not found")
}
let string = "cde"
if let distance = letters.distance(of: string) {
print("string \(string) was found at position #\(distance)") // "string cde was found at position #2\n"
} else {
print("string \(string) was not found")
}
Xcode 13 및 Swift 5에서 작동합니다.
let myString = "Hello World"
if let i = myString.firstIndex(of: "o") {
let index: Int = myString.distance(from: myString.startIndex, to: i)
print(index) // Prints 4
}
함수는 다음을 반환합니다.IndexDistance
그것은 단지.typealias
위해서Int
스위프트 4
var str = "abcdefg"
let index = str.index(of: "c")?.encodedOffset // Result: 2
참고: 문자열에 동일한 여러 문자가 포함된 경우 왼쪽에서 가장 가까운 문자만 가져옵니다.
var str = "abcdefgc"
let index = str.index(of: "c")?.encodedOffset // Result: 2
encodedOffset
는 Swift 4.2에서 더 이상 사용되지 않습니다.
사용되지 않는 메시지: 대부분의 일반적인 사용법이 잘못되었기 때문에 사용되지 않습니다. 동일한 동작을 수행하는 데 사용합니다.
그래서 우리는 사용할 수 있습니다.utf16Offset(in:)
다음과 같이:
var str = "abcdefgc"
let index = str.index(of: "c")?.utf16Offset(in: str) // Result: 2
이와 같은 색인을 검색할 때
⛔️ guard let index = (positions.firstIndex { position <= $0 }) else {
배열로 처리됩니다.당신은 컴파일러에게 당신이 정수를 원하는 단서를 주어야 합니다.
✅ guard let index: Int = (positions.firstIndex { position <= $0 }) else {
스위프트 5
문자 배열로 변환한 다음 사용할 수 있습니다.advanced(by:)
정수로 변환합니다.
let myString = "Hello World"
if let i = Array(myString).firstIndex(of: "o") {
let index: Int = i.advanced(by: 0)
print(index) // Prints 4
}
인덱스를 기반으로 문자열 작업을 수행하려면 인덱스 함수에 의해 swift.index가 검색되고 Int 유형이 아니기 때문에 기존 인덱스 숫자 접근 방식으로는 수행할 수 없습니다.문자열은 문자 배열이지만 요소를 인덱스별로 읽을 수 없습니다.
답답하네요.
모든 짝수 문자열의 하위 문자열을 새로 만들려면 아래 코드를 확인하십시오.
let mystr = "abcdefghijklmnopqrstuvwxyz"
let mystrArray = Array(mystr)
let strLength = mystrArray.count
var resultStrArray : [Character] = []
var i = 0
while i < strLength {
if i % 2 == 0 {
resultStrArray.append(mystrArray[i])
}
i += 1
}
let resultString = String(resultStrArray)
print(resultString)
출력 : acegikmoqsuwy
잘 부탁드립니다.
다음과 같이 하위 문자열의 경계에 액세스할 수 있는 확장자가 있습니다.Int
대신 sString.Index
값:
import Foundation
/// This extension is available at
/// https://gist.github.com/zackdotcomputer/9d83f4d48af7127cd0bea427b4d6d61b
extension StringProtocol {
/// Access the range of the search string as integer indices
/// in the rendered string.
/// - NOTE: This is "unsafe" because it may not return what you expect if
/// your string contains single symbols formed from multiple scalars.
/// - Returns: A `CountableRange<Int>` that will align with the Swift String.Index
/// from the result of the standard function range(of:).
func countableRange<SearchType: StringProtocol>(
of search: SearchType,
options: String.CompareOptions = [],
range: Range<String.Index>? = nil,
locale: Locale? = nil
) -> CountableRange<Int>? {
guard let trueRange = self.range(of: search, options: options, range: range, locale: locale) else {
return nil
}
let intStart = self.distance(from: startIndex, to: trueRange.lowerBound)
let intEnd = self.distance(from: trueRange.lowerBound, to: trueRange.upperBound) + intStart
return Range(uncheckedBounds: (lower: intStart, upper: intEnd))
}
}
이것이 이상함을 초래할 수 있다는 것을 알아야 합니다. 그래서 애플은 그것을 어렵게 만들기로 결정했습니다. (비록 그것은 논쟁의 여지가 있는 디자인 결정이지만 - 그것을 어렵게 만듦으로써 위험한 것을 숨깁니다...)
Apple의 String 문서에서 더 많은 내용을 읽을 수 있지만, tldr은 이러한 "인덱스"가 실제로 구현별이라는 사실에서 비롯된다는 것입니다.이들은 OS에서 렌더링한 후 문자열로 인덱스를 나타내므로 사용 중인 유니코드 사양 버전에 따라 OS에서 OS로 전환할 수 있습니다.이는 UTF 사양이 문자열에서 올바른 위치를 결정하기 위해 데이터에 대해 실행되어야 하기 때문에 인덱스로 값에 액세스하는 것이 더 이상 일정한 시간 작업이 아님을 의미합니다.또한 이러한 인덱스는 NSString에 연결된 경우 NSString에 의해 생성된 값이나 기본 UTF 스칼라에 대한 인덱스와 함께 정렬되지 않습니다.현상액에 주의하십시오.
"index is out of bounds" 오류가 발생한 경우.이 방법을 사용해 보십시오.Swift 5에서 작업
extension String{
func countIndex(_ char:Character) -> Int{
var count = 0
var temp = self
for c in self{
if c == char {
//temp.remove(at: temp.index(temp.startIndex,offsetBy:count))
//temp.insert(".", at: temp.index(temp.startIndex,offsetBy: count))
return count
}
count += 1
}
return -1
}
}
언급URL : https://stackoverflow.com/questions/34540185/how-to-convert-index-to-type-int-in-swift
'programing' 카테고리의 다른 글
셸에서 사용하는 파일 아이콘 가져오기 (0) | 2023.06.02 |
---|---|
Azure DocumentDb에서 레코드 수 가져오기 (0) | 2023.06.02 |
분기의 파일 제거로 인한 병합 충돌을 해결하려면 어떻게 해야 합니까? (0) | 2023.05.28 |
RHEL에 Python 3 설치 (0) | 2023.05.28 |
WPF의 프리즘이란 무엇입니까? (0) | 2023.05.28 |