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)