Foundation 프레임워크의 NSString이 bridge된 타입이기 때문에 NSString의 메소드를 String에서 캐스팅 없이 사용 가능합니다.
아래 """의 위치에 의해 결정됩니다

Swift의 String은 값 타입(value type)입니다. 그래서 String이 다른 함수 혹은 메소드로 부터 생성되면 String값이 할당 될때, 이전 String의 레퍼런스를 할당하는 것이 아니라 값을 복사해서 생성합니다. 반대로 이야기 하면 다른 메소드에서 할당 받은 문자열은 그 문자열을 수정해도 원본 문자열이 변하지 않기 때문에 편하게 사용하셔도 됩니다.
💥팁
NSString 활용하기//String과 NSString은 서로 완전 호환되기 때문에 옵셔널이 아니라 그냥 as로 타입캐스팅 let contents = textView.text as NSString let length = (contents.length > 15) ? 15 : contents.length //15자리까지 자르기 //substring(with: NSRange(location:length:))로 원하는 문자열의 길이만큼 자를 수 있다 contents.substring(with: NSRange(location: 0, length: length))
문자열 타입에서 인덱스로 Int에 접근이 불가능하다
문자열 타입이 참조타입이 아니라 값타입이기 때문에
Index로 접근해야한다
다시 문자열로 변환하려면 String()을 사용해 변환해야 한다
[(String1), (String2)]으로 저장되어 있는데
배열의 첫번째 String1에 접근하려면 아래와 같이 접근해야 한다.
[arrName][0].0
var timeString:String = "[00:16:200"
var firstIndex = timeString.index(timeString.startIndex, offsetBy: 1)
String(timeString[firstIndex..<timeString.endIndex]) //00:16:200
Substring은 해당 문자열의 원본을 참조하게 됩니다.
더 이상 원본을 사용하지 않는다면 사용하지 않는 메모리를 절감하기 위해서
String()으로 인스턴스를 생성하는 것이 좋습니다.

let greeting = "Hello, World!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning : Hello
// SubString인 beginning을 String으로 변환
let newString = String(beginning)
그 외 메소드
hasPrefix(:), hasSuffix(:) 메소드
11654 Character asciiValue UnicodeScalar
아스키코드로 변환하기
let x = readLine()!
let c = Character(x)
let ascii = c.asciiValue
print(ascii!)
import Foundation
struct Q11654 {
static func main() {
if let read = readLine() {
if let ascii = UnicodeScalar.init(read)?.value { print(ascii) }
}
}
}
Q11654.main()
출처: https://oingbong.tistory.com/198
11720 String을 for문으로 돌렸을 때를 기억하자
문자열에서 출력된 각각의 문자는 Character데이터 타입이라는 것이 주의하자
let hello: String = "it's me"for i in hello { print(i) }
//결과값
i
t
'
s
m
e
_ = readLine()
if let line = readLine() {
var sum = 0
for i in line {
sum += Int(String(i))!
}
print(sum)
}
10809
못풀겠다... var hi = "hello" hi.index(of:"h") 뭐 이게 안되고 hi.firstIndex(of:"h")로 바뀌었다는데...모르겠다...
2675
QR Code "alphanumeric" 문자는0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./:이다.
import Foundation
var n = Int(readLine()!)!
for _ in 1 ... n {
let stringArr = readLine()!.components(separatedBy: " ").map( {String($0)} )
let r = Int(stringArr[0])!
for char in stringArr[1] {
for _ in 1 ... r {
print(char, terminator: "")
}
}
print()
}
오류
error: value of type 'String' has no member 'components'
components 메서드를 사용했는데
NSString 메서드여서 import Foundation이 필요했다...
아 맞다... split일 때 import Foundation이 필요없었지...
1157
대문자 스트링값 리턴받기
string.uppercased()
딕셔너리 타입 활용하기var dic = [String:Int]() dic.keys dic.updateValue() dic.values.max()
if let str = readLine() {
let upperStr = str.uppercased()
var dic = [String:Int]()
for char in upperStr {
if dic.keys.contains(String(char)) {
if let value = dic[String(char)] {
dic.updateValue(value+1, forKey: String(char))
}
} else {
dic.updateValue(1, forKey: String(char))
}
}
var result = [String]()
for key in dic.keys {
if dic[key] == dic.values.max()! {
result.append(key)
}
}
print(result.count > 1 ? "?" : "\(result[0])")
}
1152
split(separator: " ")는 빈 공간을 없애준다.
components(separatedBy: " ")는 그렇지 않고 Foundation을 import 해야한다.
입력받은 문자열의 처음과 끝에 공백이 있을 수 있어서 split을 사용했다.
let result = readLine()!.split(separator: " ").map{ String($0) }
print(result.count)
18312
contains뒤에 찾을 문자열을 넣으면 될텐데...
Cannot convert value of type 'String' to expected argument type 'String.Element' (aka 'Character')
Int에서 Character으로 변경하는 건 안됐고...
String에서 Character으로 변경해서 넣어줬다...
let nk = readLine()!.split(separator: " ").map { String($0) }
let n = Int(nk[0])! //00시 00분 00초부터 N시 59분 59초까지
let k = nk[1] //K 포함
var result = 0
for x in 0...n {
for y in 0..<60 {
for z in 0..<60 {
let time = "\(x)\(y)\(z)"
if time.contains(Character(k)) {
result += 1
}
}
}
}
print(result)