#学志#swift3.0 类的初学习

来源:互联网 发布:java 获取对象大小 编辑:程序博客网 时间:2024/05/17 03:57

老师的作业:

枚举可以同时有原始值和关联值吗??

应该是不可以的;

import UIKitimport Foundationenum 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")





0 0