#學志#swift3.0 類的初學習

老師的作業:

枚舉可以同時有原始值和關聯值嗎??

應該是不可以的;

import UIKit
import Foundation

enum Sex{
    case male(n : String), female(n : String)
}
enum BirthError : Error{
    case tooYoung
    case tooOld
}

//Person類
class Person {
    static var count = 0  //構造函數被訪問幾次,即創建的人數
    var firstName = ""
    var lastName = ""
    var sex : Sex
    let birth : String
    var address = ""
    
    //計算屬性年齡
    var age : Int{
        get{
            
            //給的出生年月日
            var year : Int
            let y = NSString(string: self.birth)
            year = Int(y.substring(with: NSMakeRange(0, 4)))!
            //獲得當前系統的年份
            let calendar: Calendar = Calendar(identifier: .gregorian)
            var comps: DateComponents = DateComponents()
            comps = calendar.dateComponents([.year,.month,.day, .weekday, .hour, .minute,.second], from: Date())
            let systemY:Int = comps.year!
            //print(systemY)
            
            return (systemY - year)
        }
    }
    //構造函數
    init?(firstName:String, lastName:String, sex:Sex, birthday:String, address:String){
        defer{
            print("")
            print("現在總共有\(Person.count)個人")
            print()
        }
        self.firstName = firstName
        self.lastName = lastName
        self.sex = sex
        self.address = address
        do{
            self.birth = birthday
            try processBirth(birthday:birthday)
            Person.count += 1
//            print("姓名爲:\(self.getName()),現生日日期是:\(birthday), 年齡是:\(self.age)歲, 地址是:\(self.address),屬性姓氏:\(self[0]),名稱爲:\(self[1])")
            switch self.sex {
            case let .female(n: s):
                print("姓名爲:\(self.getName()),現生日日期是:\(birthday), 年齡是:\(self.age)歲, 地址是:\(self.address),屬性姓氏:\(self[0]),名稱爲:\(self[1]), 性別爲:\(s)")
            case let .male(n: s):
                print("姓名爲:\(self.getName()),現生日日期是:\(birthday), 年齡是:\(self.age)歲, 地址是:\(self.address),屬性姓氏:\(self[0]),名稱爲:\(self[1]), 性別爲:\(s)")
            default:
                break;
            }
        }
        catch BirthError.tooYoung{
            print("該person的生日日期\"\(birthday)\"設置過小,創建失敗!")
            return nil
        }
        catch BirthError.tooOld{
            print("該person的生日日期\"\(birthday)\"設置過大,創建失敗!")
            return nil
        }
        catch{
            //放置一個空的catch防止錯誤
        }
    }
    
    //得到全名
    func getName() -> String{
        return firstName + lastName;
    }
    
    //判斷是否同名
    func sameName(p:Person){
        print("兩人名字分別爲:\(self.getName()), \(p.getName())")
        if self.getName() == p.getName(){
            print("兩人同名!")
        }
        else{
            print("兩人不同名!")
        }
    }
    
    //判斷是否爲相同實例(判斷是否爲同一個人是通過實例還是所有信息?)
    func samePerson(p:Person){
        if self === p{
            print("是同一個人!")
        }
        else{
            print("不是同一個人!")
        }
    }
    //對生日不合理的進行錯誤拋出
    func processBirth(birthday : String) throws{
        if "2000年01月01日" > birth {
            throw BirthError.tooYoung
        }
        if birth > "2016年12月31日"{
            throw BirthError.tooOld
        }
    }
    
    //下標設置,讀取姓名
    subscript(index : Int) -> String{
        get{
            switch index{
            case 0 :
                return String(describing: self.firstName)
            case 1 :
                return String(describing: self.lastName)
                
            default:
                return ""
            }
        }
    }
    
}

func create(){
    
    
    let m = Sex.male(n:"男")
    let f = Sex.female(n:"女")
    print("創建person")
    let person = Person(firstName:"汪", lastName:"美美",sex:m, birthday
        :"2013年02月03日",address:"海曙路58號")
    print("創建person2")
    let person2 = Person(firstName:"汪", lastName:"美美",sex:f, birthday:"2019年12月25日",address:"長安路58號")
    print("創建person3")
    let person3 = Person(firstName:"汪", lastName:"美美",sex:f, birthday:"2012年12月25日",address:"長安路34號")
    let person4 = Person(firstName:"汪", lastName:"美美",sex:f, birthday:"1990年01月25日",address:"長安路34號")
    print("person與person3")
    person?.sameName(p: person3!)
    print("person與person3")
    person?.samePerson(p: person3!)
}
create()


結果(如何同時設置原始值和關聯值??):

創建person

姓名爲:汪美美,現生日日期是:20130203,年齡是:3,地址是:海曙路58,屬性姓氏:汪,名稱爲:美美,性別爲:男


現在總共有1個人


創建person2

person的生日日期"20191225"設置過大,創建失敗!


現在總共有1個人


創建person3

姓名爲:汪美美,現生日日期是:20121225,年齡是:4,地址是:長安路34,屬性姓氏:汪,名稱爲:美美,性別爲:女


現在總共有2個人


person的生日日期"19900125"設置過小,創建失敗!


現在總共有2個人


personperson3

兩人名字分別爲:汪美美,汪美美

兩人同名!

personperson3

不是同一個人!


ps:

當某變量爲可選類型時,var name : String!
在有值時,若直接輸出,則是正常輸出;print(name)
      若在字符串中輸出則帶有optional
在無值時,若直接輸出則程序出錯中斷;
        若在字符串中輸出則顯示爲nil,但程序不會出錯;
代碼:

var name : String!

//print(name)

print("\(name)")

name = "htt"

print(name)

print("\(name)")


結果:

nil

htt

Optional("htt")





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章