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 {

  

    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))) {

        

        guard date > 0 && date < 31 else {

            throw DateError.incorrectData(part: "date")

        }

        dateResult.date = date

    }

    else {

        throw DateError.incorrectFormat(part: "date")

    }

    return dateResult

}




try parseDate(param: "2020-02-28")



let date = try parseDate(param: "2020-02-28")


일단 여기까지 이해가 가지 않는 부분은 if 를 통해서 상수 year, month, date 를 만들었는데 여기 안에 있는 구문들이 포함된 상수 year, month, date 들은 dateResult 에 대입된단 말이지.. 그리고 dateResult 는 결국에 구조체 Date 와 연결이 되어 있고...

근데 왜 아래에서 호출 할땐 parseDate 의 매개변수인 param 에다가 저 상수들의 값을 써버리는거냐..? 만약에 상수들과 parseDate의 매개변수인 param 이 연결되어서 substring 을 통해서 한번에 문자열을 쓰면 location 이랑 length 를 통해서 추출 된다고 생각하면 될텐데 dateResult 랑 연결된건 분명한데 parseDate 의 매개변수인 param 과 연결된 부분은 못찾겠다...

설명 좀 부탁한다...



-------------------------------------------------------------------------------------------------------------



func getPartDate(date: NSString, type: String) {

    do {

        let date = try parseDate(param: date)

        

        switch type {

        case "year" :

            print ("(date.year)년 입니다.")

            

        case "month" :

            print ("(date.month) 입니다.")

            

        case "date" :

            print ("(date.date) 입니다.")

            

        default:

            print ("입력값에 해당하는 날짜가 없음")

        }

    }

        

    catch DateError.overSizeString {

        print ("문자열이 너무 김")

    }

    catch DateError.underSizeString {

        print ("문자열이 너무 짧음")

    }

    catch DateError.incorrectData(let part) {

        print ("잘못된 값임")

    }

    catch DateError.incorrectFormat(let part) {

        print ("잘못된 형식")

    }

    catch {

        print ("알수 없는 오류 발생")

    }

}


getPartDate(date: "1999-12-30", type: "year")

getPartDate(date: "1999-13-21", type: "month")


여긴 catch 부분인데 getpartdate 가 위에 parseDate 하고 도데체 연결된 부분이 메소드 안에 상수 date 인거 같은데 아래 구문들이 getPartDate의 매개변수인 date 와 연결된 부분이 없는데 

왜 또 날짜 값을 getPartDate 의 매개변수인 date 에 줄수 있는거임~!??


와 진짜 사람 돌아 버리겠네...

함수 공부 다시 해야되나...?? 내가 뭔가 놓치고 있는게 있는건가..



참고로 나는 프로그래밍 처음 입문해서 스위프트 기본 문법 공부 하는 중임....


이것 좀 알려주면 내가 은혜는 꼭 갚도록 하지...