enum DateError : Error {
case overSizeString //입력된 데이터 길이가 필요한 크기보다 큼
case underSizeString //입력된 데이터 길이가 필요한 크기보다 부족
case incorrectFormat(part:String) // 입력된 데이터의 형식이 맞지 않음
case incorrectData(part:String) // 입력된 데이터 값이 올바르지 않음.
import Foundation
struct Date {
var year : Int
var month : Int
var date : Int
}
func parseDate(param:NSString) throws -> Date {
// 입력된 문자열의 길이가 10이 아닐 경우 분석이 불가능하므로 오류
guard param.length == 10
else {
if param.length > 10 {
throw DateError.overSizeString
}
else {
throw DateError.underSizeString
}
}
//반환할 객체 타입 선언
var dateResult = Date(year: 0, month: 0, date: 0)
//연도 정보 분석
if let year = Int(param.substring(with: NSRange(location:0, length:4))) {
dateResult.year = year
}
else { // 연도 정보 분석 오류
throw DateError.incorrectFormat(part: "year")
}
// 월 정보 분석
if let month = Int(param.substring(with: NSRange(location: 5, length: 2))) {
guard month > 0 && month < 13
else {
throw DateError.incorrectData(part: "month")
}
dateResult.month = month
} else { // 월 정보 분석 오류
throw DateError.incorrectFormat(part: "month")
}
// 일 정보 분석
if let date = Int(param.substring(with: NSRange(location: 8, length: 2))) {
// 일에 대한 값은 1~31 까지만 가능하므로 이외의 범위는 잘못된 값으로 처리한다.
guard date > 0 && date < 31 else {
throw DateError.incorrectData(part: "date")
}
dateResult.date = date
}
else { // 일분석 오류
throw DateError.incorrectFormat(part: "date")
}
return dateResult
}
// year 과 month, date 가 다른 이유는 year 은 아무 년도나 사용해도 되지만 month 와 date 는 숫자의 제한이 있기 때문에 구문이 하나 더 들어간것.
try parseDate(param: "2020-02-28")
// 이 값을 다른 변수나 상수에 할당할 때도 try 키워드는 항상 함수의 이름 바로 앞에 있어야 함.
let date = try parseDate(param: "2020-02-28")
나는 기본 문법 공부중인데 오류 처리 하는 부분이 이 문법의 마지막 부분인데 이 마지막이 참 어렵네 ...
일단 위에 내용은 이해를 했는데 파운데이션을 사용하는건 이번이 처음이라
마지막 부분에 보면 param : "2020-02-28" 구문이 보이는데 저게 NSString 의 기능인가???
var dateResult = Date(year: 0, month: 0, date: 0)
if let year = Int(param.substring(with: NSRange(location:0, length:4))) {
dateResult.year = year
이 부분을 보면 알겠지만 let year 은 dateResult.year 로 대입 되는데 dateResult 는 구조체 Date 를 대입시킨거기 때문에
결국엔 구조체 Date 로 입력이 되는거나 마찬가진데
뭐 다 넘어가서 변수 3개가 존재 하는데
위에서는 어떻게 "2020-02-28" 로 하나의 문자열에 3개의 변수 정보가 다 넣을 수 있는거지?
이 부분이 진짜 이해가 가질 않네..
아는 사람은 답 좀 부탁한다...
아조씨야 Nsstring은 걍 문자열이고 struct에 parsedate함수가 넣어주고 있자니
Objc에도 그랬지만 name binding인거지
이건 스위프트같은디?.. 암튼 "2020-02-28"이게 하나의 NSString이고 거기서 연 월 일 부분을 추출해서 date 구조체로 변환하는 함수인듯 0-4번째까지 문자열에서 연 추출하고 월은 5번째에서 2자 길이만큼 읽어서.. 일도 마찬가지
아 저게 네임 바인딩이라는 거군아~! 저렇게 네임바인딩 하는게 NSString 기능인건가? 고맙다~! 드디어 이해가 가는군아 ㅎ
substring 은 어떤 문자열에서 일부 문자열을 추출하는 메서드임
substring 은 어떤 문자열에서 일부 문자열을 추출하는 메서드! 아직 이건 안배웠는데 책에서 지맘대로 써버려서 몰랐네... 고맙다 dd야 ~!!
오류 객체 잡아내는 구문 이거 너무 어렵네.. 와 마지막에 진짜 돌아 버리것다...
C++ 이나 자바 씨샵 이나 기타 oop해본적 없냐 형태만 다르고 죄다 비슷비슷해지는 판국인데