老师的作业:
枚举可以同时有原始值和关联值吗??
应该是不可以的;
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
姓名为:汪美美,现生日日期是:2013年02月03日,年龄是:3岁,地址是:海曙路58号,属性姓氏:汪,名称为:美美,性别为:男
现在总共有1个人
创建person2
该person的生日日期"2019年12月25日"设置过大,创建失败!
现在总共有1个人
创建person3
姓名为:汪美美,现生日日期是:2012年12月25日,年龄是:4岁,地址是:长安路34号,属性姓氏:汪,名称为:美美,性别为:女
现在总共有2个人
该person的生日日期"1990年01月25日"设置过小,创建失败!
现在总共有2个人
person与person3
两人名字分别为:汪美美,汪美美
两人同名!
person与person3
不是同一个人!
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")