Swift

import Foundation

print("Hello, World!")

//1.结构体
struct Rect{
    //声明结构体属性,(存储属性)
    var x : Float
    var y : Float
    var width : Float
    var height : Float
    
    //声明结构体变量属性
    static var description : String?
    
    //声明结构体的变量属性,(计算属性)
    //计算属性:这个属性专门计算其他属性的值,但其本身并不存储值,一般提供setter,getter方法,在setter,getter方法中实现对其他属性的计算
    var centerX :(Float){
        //setter方法
        set{
            //如果这个修改的属性是let类型的,那么不能进行修改,会报错
            x = newValue//这里的newValue是系统传递过来的数值,代指是调用setter方法的时候后面赋予 的值
        }
        get{
            return x+width/2
        }
    }
    
    var centerY :(Float){
        //getter方法是必须的,但是setter方法可以省略
    get {
    return y + height/2
    }
    }
    
    var totalLength :(Float){
        set{
            //计算属性可以对多个属性进行操作
            width = newValue / 4
            height = newValue / 4
        }
        get{
            //也可以同时返回多个属性计算的结果
            return (width + height) * 2
        }
    }
    
    //swift里面的结构体可以声明方法
    //声明方法,结构体方法不设置返回值
    func frameInfo(){
        
        print("frame的宽为(width),高为(height),周长为(totalLength)")
        
        //属性值的改变只能在计算属性里面去写
      
    }
    
    
    //声明结构体方法
    static func info(){
        print("这是一个结构体方法")
        //结构体变量只能在结构体方法里面使用,正常的方法里面不能使用它
        description = "2016年4月8日创建"
    }
}

//初始化结构体
var frame = Rect (x: 100, y: 100, 200, height: 200)
//打印frame
print(frame)
frame.x = 300
print(frame)

//计算属性的调用
frame.centerX = 200//这句代码,相当于调用了centerX属性的setter方法
print(frame)
print(frame.centerX)//这一句代码相当于调用了centerX的getter犯法

print(frame.totalLength)

//方法的调用
frame.frameInfo()

//结构体的属性在结构体里是全局的,所以要用结构体名来调用
Rect.info()



//2.类

//class Person{
//    //属性
//    var name : String?
//    var age : Int?
//    
//    //初始化方法,这里的参数列表要和上面的保持一致
//    init (name : String, age : Int){
//      self.name = name
//        self.age = age
//    }
//}
//
////2.1.类的使用
//var person = Person(name: "铁锤妹妹", age: 18)
////2.2.属性的使用
//print(person.name!)

class Person {
    //2.2.1.属性
    //声明对象属性
    var name : String?
    var age : Int?
    //声明类属性
    static var introduce : String?
    //声明计算属性
    var value : Int{
        set(a){
           age = a//setter getter方法中不能出现self,会造成死循环
}
        get{
     return age!//这里不要忘记了拆包
}
    }
    
    //.2.2.2.方法
    //(1).声明类方法
    //在类中如果使用static修饰,那么表示两个事件:1.他是类方法 2.他不能被子类重写
    static func sayHi() {
        
        print(introduce!)//类属性只能在类方法里使用,正常方法中不能使用
    }
    
    //在类中如果方法使用class修饰,那么表示两个事:1.他是类方法2.他能被子类重写
    class func sayHi1() {
        print(introduce!)
    }
    
    //(2).声明实例方法
    func sayHi2(){
        print("hello ,我是一个实例方法!!")
    }
    
    //自定义初始化方法(构造函数)
    init(name :String , age :Int){
     self.name = name
        self.age = age
    }
    
    init(name :String){
        self.name = name
    }
}

//怎么让一个类继承另一个类
class Student :Person{
    //重写父类的方法
    //子类重写父类的方法,必须添加override关键字
    override class func sayHi1() {
        print("我是student类重写了父类的类方法")
    }
    
    //重写父类的实例方法
    override func sayHi2() {
        print("重写了父类的实例方法")
    }
}

//类的穿建和实现
var person = Person (name: "李海洋", age: 28)
//调用类的类属性
Person.introduce = "大家好我是Person类,我喜欢人"

//调用类方法
Person.sayHi1()
Person.sayHi()
//调用实例方法
person.sayHi2()
//调用实例变量
print(person.name!)
person.name = "网汇通"
print(person.name!)
//调用计算属性
person.value = 30
print(person.age!)
//关于student
var student = Student(name: "小钰", age: 14)
//调用实例方法
student.sayHi2()
//调用类方法
Student.sayHi()
Student.sayHi1()


//3.值类型和值引用
//struct Animal{
//    var name :String
//    var age : Int
//    
//    init(name : String,age :Int){
//        self.name = name
//        self.age = age
//    }
//}
//
////使用这个方法
////(1).创建一个dog变量
//var dog = Animal(name:"旺财", age: 8)
////(2).创建另一个dog变量,等于原先的dog变量
//var dog1 = dog//此时dog1的值是从dog变量中拷贝一份出来的,是新的值
////(3).改变原先的dog变量
//dog.name = "阿黄"
////(4).打印两个变量的值
//print("(dog.name)->(dog1.name)")


class Animal {
    var name :String?
    var age :Int?
    
    init(name :String,age :Int){
        self.name = name
        self.age = age    }
}

//创建类的对象
var cat = Animal(name: "喵小喵", age: 1)
var cat1 = cat//访问的是同一块地址
cat.name = "喵十八"

print("(cat.name!)->(cat1.name!)")

//4.协议
//如果协议里面包含可选实现的方法,那么需要添加一个@objc关键字作为标记

 @objc protocol marryDelegate{
    //协议里面写的方法都是必须实现的
    func cook()
    func wash()
    //协议里面如果方法可选需要加关键字optional
    optional func hitDouDou()
}

protocol husbandDelegate{
    //挣钱
    func makeMoney()
}

//class Man : Person<marryDelegate,husbandDelegate>
//Swift规定,类名后面第一个是父类,剩下的都是接受的协议的名字
class Man :Person ,marryDelegate,husbandDelegate {
    @objc func cook() {
        print("红烧鲤鱼请你吃")
    }
    @objc func wash() {
        print("洗衣服")
    }
    func makeMoney() {
        print("我得多挣钱")
        
    }
}

//看看协议是否好用
var man = Man(name: "小小",age:18)
man.makeMoney()

//5.类的扩展
//(1).扩展类遵循协议中的方法的实现
extension Man{
    @objc func hitDouDou() {
        print("打豆豆")
    }
}

//(2).扩展一个类的方法,结果一个类添加一个类方法,类似于OC里面的Category
extension Man{
    //添加一个方法
    func joke(){
        print("php")
    }
}

man.hitDouDou()
man.joke()

//6.闭包(Block)
//Block 匿名函数
//int(^myBlock)(int a, int b)= ^int (int a, int b) {
//  return a>b?a:b
// }

var MyBlock :((a:Int ,b:Int)->Int)

//功能:求;两个数的最大值
//第一种方式
MyBlock = {
    (a:Int,b:Int) -> Int in//in是闭包结构的语法的一部分,必不可少,前面指定的是参数列表和返回值等信息
    return a > b ? a : b
}

//第二种方式
MyBlock = {
    a,b in
    return a > b ? a : b
}

//第三种
MyBlock = {
    (a,b)-> Int in
    return a > b ? a : b
}

//第四种
MyBlock = {
     a,b in
     a > b ? a : b
}

//第五种(逆袭神技)
MyBlock = {
    $0 > $1 ?$0 : $1
}

//调用
let max = MyBlock(a: 3, b: 5)
print(max)

原文地址:https://www.cnblogs.com/fzkwan5438020/p/5368625.html