import Foundation
// 创建一个类
class Student {
// 属性(类的属性必须赋初值,如果不赋值,需要写自定义方法)
var studentName: String
var studentAge: Int
// 方法
func fallInLove(girlName:String) {
print("\(self.studentName)看上隔壁的\(girlName)")
}
// 构造方法(自定义init方法)
init (studentName1:String, studentAge1:Int) {
// 左边是属性,右边是形参
self.studentName = studentName1
self.studentAge = studentAge1
}
}
// 实例化一个student
var student = Student(studentName1: "老王", studentAge1: 18)
// 访问属性
print("\(student.studentName)的年龄为\(student.studentAge)")
// 设置年龄
student.studentAge = 20
print("\(student.studentName)的年龄为\(student.studentAge)")
// 方法调用(OC中是方括号,swift中是用点语法)
student.fallInLove("如花")
/***************** 结构体 ****************/
// 结构体不用自定义init方法,即不用写构造方法,系统会根据属性自动生成
// 类可以继承,结构体不能继承
// 类,如果创建的是let类型,只要属性是var就可以修改
// 结构体,如果创建的是let类型,即使属性是var也是不能修改的
// 结构体,首字母大写
struct GirlSTR {
// 属性
var girlName:String = "林志玲"
var girlHeight:Double = 175.5
// 方法
func togetherAction(boyName:String){
print("\(self.girlName)和\(boyName)")
}
}
// 实例化一个结构体
var girl = GirlSTR()
// 访问属性
print(girl.girlName)
// 设置属性
girl.girlName = "苍老师"
print(girl.girlName)
// 方法调用
girl.togetherAction("隔壁老王")
// 类是引用类型,结构体是值类型
var tempStudent = Student(studentName1: "张三", studentAge1:18)
var tempStudent2 = tempStudent
tempStudent.studentName = "李四"
print("\(tempStudent.studentName)->\(tempStudent2.studentAge)") // 结果为李四->18
var tempGirl = GirlSTR()
var tempGirl2 = tempGirl
print("\(tempGirl.girlName)-\(tempGirl2.girlName)") // 结果都为林志玲-林志玲
tempGirl2.girlName = "苍老师"
print("\(tempGirl.girlName)-\(tempGirl2.girlName)") // 结果为林志玲-苍老师
/****************** 属性 *****************/
// 从功能方面分为两种:1.存储属性 2.计算属性
// 从调用方式分两种:1.实例属性 2.类属性
// 存储属性(存储我们设置的属性值)
class Animal {
// 定义一个存储属性
var animalName:String
// 如果不想赋初值,也不想在init方法中写,就要把这个属性的类型变为可选类型
var isSpeaking:Bool?
// 构造方法
init(animalName:String){
self.animalName = animalName
}
}
// 实例化
var tempAnimal = Animal(animalName: "米老鼠")
print(tempAnimal.animalName)
print(tempAnimal.isSpeaking)
// 计算属性
class Animal2 {
// 存储属性
var animalName:String?
// 计算属性(不能直接存储值,有set和get方法)
var replaceName:String{
// get方法必须写返回值
// get方法是必须写的,set方法可以不写,此时属于只读属性
get {
return "hello kitty"
}
set{
// newValue是系统变量
self.animalName = newValue
}
}
}
var animal2 = Animal2()
// set方法
animal2.replaceName = "唐老鸭"
// get方法
print(animal2.replaceName)
// 类属性
class Animal3 {
// 实例属性(存储属性)
var animalNmae:String?
// 类属性(只能是计算属性)
class var animalFriend:String {
get{
return "Tom"
}
}
}
// 实例化
var animal3 = Animal3()
// 用实例对象去调用
animal3.animalNmae = "Hello Kitty"
// 类属性,直接用类调用
print(Animal3.animalFriend)
// 结构体中的类属性
struct Animal4{
// 结构体中的类属性 static修饰,可以是存储属性
static var animal4Name:String = "Hello Kitty"
// 类属性 计算属性
static var animal4Friend:String{
get{
return "TomCat"
}
}
}
// 调用类属性
print(Animal4.animal4Name)
print(Animal4.animal4Friend)
/*************** 方法 *********************/
// 方法分为两大类:1.实例方法 2.类方法
class CityInfo {
// 存储属性,实例属性
var cityName:String?
var cityTravelPoint:String?
// 类属性
class var printCityOtherTravelPoint:String {
get{
return "*"
}
}
// 实例方法
func printCityTravelPoint(){
print("\(cityTravelPoint!)是\(cityName!)的景点")
}
// 类方法只能使用类属性
class func printCityTravelPoint(travelPoint1 travelPoint1:String, travelPoint2:String) {
print("\(travelPoint1)-\(travelPoint2)")
}
}
// 实例化
var tempCity = CityInfo()
tempCity.cityName = "北京"
tempCity.cityTravelPoint = "故宫"
// 调用实例方法
tempCity.printCityTravelPoint()
// 调用类方法
CityInfo.printCityTravelPoint(travelPoint1: "北海", travelPoint2: "长城")
// 结构体中的类方法
struct CityInfo2{
// 存储属性 实例属性
var cityName2:String?
var cityPoint2:String?
// 类属性
static var cityName22:String = "NewYork"
static var cityPoint22:String = "*女神像"
// 实例方法(只能使用实例属性)
func printCityInfo(){
print("\(cityName2!)的景点有\(cityPoint2!)")
}
// 类方法(只能使用类属性)
static func printCityInfo2(){
print("\(cityName22)的景点有\(cityPoint22)")
}
}
// 调用实例方法
var tempCity1 = CityInfo2(cityName2: "洛阳", cityPoint2: "白马寺")
tempCity1.printCityInfo()
// 调用类方法
CityInfo2.printCityInfo2()
// 属性观察器(监测属性的变化)
class Iphone{
var iphoneType = "6Plus"
var iphoneColor = "Gole"
var iphonePrice : Int = 6000 {
willSet{
print("newValue = \(newValue)")
}
didSet{
print("oldValue = \(oldValue)")
}
}
}
var tempiPhone = Iphone()
print("\(tempiPhone.iphoneColor)->\(tempiPhone.iphonePrice)")
// 降价
tempiPhone.iphonePrice = 4500
// 涨价
tempiPhone.iphonePrice = 5000
/************** 继承 **************/
// 父类
class Zombie {
// 存储属性
var blood:Int = 10
// 计算属性
var name:String {
get {
return "普通僵尸"
}
}
// 方法
func speaking() {
print("父类普通僵尸")
}
}
// 子类
class PailZombie:Zombie {
var tool: String = "铁桶"
// 重写父类方法,前面需加override
override func speaking() {
print("子类铁通僵尸")
}
}
// 实例化一个父类
var tempZombie = Zombie()
print(tempZombie.blood)
// 实例化一个子类
var tempPailZombie = PailZombie()
// 子类继承父类的属性
print(tempPailZombie.blood)
// 子类自己的属性
print(tempPailZombie.tool)
// 子类继承父类的方法
tempPailZombie.speaking()
/************** 协议 ****************/
// 协议关键字 protocol
@objc protocol MerryDelegate {
// 必须实现的方法
func cook()
// 可选实现的方法
optional func shopping()
}
class Man: MerryDelegate {
var name:String?
// 代理方法
@objc func cook() {
print("今天我做饭")
}
}
// 实例化一个对象
var tempMan = Man()
tempMan.name = "小明"
// 执行代理方法
tempMan.cook()
/***************** 延展 ***************/
// 延展可以扩充协议中的方法
extension Man {
func shopping() {
print("清空购物车")
}
}
// 执行的是延展中的方法
tempMan.shopping()
// 延展可以扩充类中的方法
extension Man {
func travel () {
print("周末去旅游")
}
}
// 执行延展类中的方法
tempMan.travel()
/*************** 闭包(相当于block) ****************/
// 定义一个闭包 in的前面是参数列表和返回值,后面是要执行的block块
var block = { (str:String)->Void in
print("block = \(str)")
}
// 调用
block("万万没想到")