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개의 변수 정보가 다 넣을 수 있는거지?


이 부분이 진짜 이해가 가질 않네..


아는 사람은 답 좀 부탁한다...