Fork me on GitHub

Swift语言学习---------高级

一.结构体.

示例代码:

//*****************结构体(Struct)***************
//1.声明一个结构体
struct rect{
  //声明结构体变量成员的属性(存储属性)
    var x:Float
    var y:Float
    var With:Float
    var Height:Float
    
    //声明结构体属性
    //注意:需要使用Static关键字修饰
    static var description:String?
    
    //计算属性(本身不存值,专门用于计算其他属性的值)
    var centerX :Float{
      //setter方法
        set{
    
        x = newValue
        
    }
      //getter方法
        get{
        
        return x + With/2
        
        }
    }
    
    var centerY :Float{
    
        get{
        
            return y;
        }

    }
    //声明方法
    //声明一个结构体对象(结构体变量)方法[类似于类中的实例(对象)方法]
    func info(){
     print("x:\(x) y:\(y) width:\(With) height:\(Height)")
    
    }
    //声明结构体方法[类似于类中的类的方法]
    static func info1(){
          print("这是一个结构体方法")
    
    }
    
}
//1.根据结构体类型创建结构体对象(结构体变量)
var rect1 = rect(x: 0, y: 0, With: 100, Height: 100)
//注意:如果结构体对象是常量内部的属性是不允许修改的

//访问结构体对象的属性
rect1.x = 20

print(rect1.x)

//访问结构体属相
rect.description = "我是结构体属性"

print(rect.description!)
//访问结构体对象的计算属性
rect1.centerX = 100 //在调用center中的setter方法
let value = rect1.centerX   //在使用centerx的getter方法

//使用结构体对象方法
rect1.info()


//使用结构体方法
rect.info1()

 

二.类及继承

示例代码:

//类*****************************************
//class Person{
//    var name:String?
//    var age:Int?
//    //构造方法
//    init(name:String, age:Int){
//        self.name = name
//        self.age = age
//    }
//}
//
////创建一个Person对象
//var p1:Person = Person(name: "张三 ", age: 20)
//
////访问类中的属性
//print(p1.name!)
//print(p1.age!)

class Person {
    //声明属性
    var name:String?
    var age:Int?
    
    //声明类属性
    static var introduce:String!   //(存储属性)
    //声明计算属性(类,结构体,枚举)
    var number:Int{
        get{
        
          return self.age!
        }
        set(value){   //这种写法表示在调用number的set方法时传过来的参数赋值给value
          age = value   //注意切记setter/getter方法中不能使用self.的形式
        
        }
    
    
    }
    
    //声明类方法  static修饰时,不能被子类重写   class修饰的可以
    static func sayHi(){
    
        print(introduce)
        //注意在类方法中不能使用对系那个属性,只能使用类属性
        
    }
    
    class func sayHi2(){

    }
    //声明构造方法
    init(name:String,age:Int){
       self.name = name
        self.age = age
    
    }
    init(name:String){
       self.name = name
    
    }
    //声明一个对象方法
    func sayHello(){
       print("我是对象方法")
    
    }
  
}


//继承
class Student:Person {
    //重写父类的类方法
    override class func sayHi2(){
    
        print("我是Student类,重写了父类的类方法")
    
    
    }
}

//
let person = Person (name: "李四", age: 25)
person.sayHello()   //使用对象方法
Person.sayHi2()   //使用的是类方法
Student.sayHi2()  //使用的Student中重写父类的那个方法

//创建Student对象
let  student:Student = Student(name: "小碗", age: 21)


//值类型与引用类型***************************************
//值类型变量
//struct animal {
//
//    var name:String?
//    var age:Int?
//    
//
//}
//var dog = animal(name: "小明", age: 2)
//var dog1 = dog   //此时dog1是从dog拷贝过来的值,是一份新值
//dog.name = "小花"
//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 dog = animal(name: "小黄", age: 3)
var dog1 = dog   //此时dog1是从dog拷贝过来的值,是一份新值
dog.name = "小花"
print("\(dog.name!),\(dog1.name!)")

 

三.协议及扩展.

示例代码:

//协议(protocol)***************************************
//当协议前有可选方法时,该协议前要用关键字@objec修饰,可选实现方法用optional修饰
@objc protocol  MerrayDelegate{

   func cook()  //做饭
   func wach()  //洗衣服
   optional func hitDoudou() //打豆豆

}
protocol DividDelegate{

   func lookAfterChild()

}

class Man: Person,MerrayDelegate,DividDelegate {
    
    @objc func cook() {
        print("还好学了几年手艺")
    }
    
    @objc func wach() {
        print("手洗")
    }
  
    func lookAfterChild() {
        print("看小孩")
    }
}
//扩展   (实现代码的分离,不过与臃肿)
extension Man{
    @objc func hitDoudou() {
        print("打豆豆")
    }

}


//
let man:Man = Man(name: "黄海波", age: 40)

man.cook()

man.hitDoudou()

//扩展(extension)**************************************************

//1.扩展一个类遵循的协议的方法的实现
//扩展   (实现代码的分离,不过与臃肿)

//extension Man{
//    @objc func hitDoudou() {
//        print("打豆豆")
//    }
//    
//}

//2.扩展一个类的方法(类似于oc中的category类目)
extension Man {
    //扩展一个对象方法
    func sing(){
      print("哈哈")
    }
   //扩展一个类方法
    class func eat() {
        print("吃饭")
    }
}
man.sing()
Man.eat()

 

四.闭包

闭包类似于于block函数  ]

注意:闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,
闭包函数体即将开始。

 

示例代码:

//闭包  相当于block函数
//求两个整型数中的最大值
//第一种方式实现闭包
var maxResult:((a:Int, b:Int) ->Int) = {
//这个函数的类型是(a:Int, b:Int) ->Int

    (a:Int,b:Int)->Int in
    
    return a > b ? a : b

}

print(maxResult(a: 3, b: 5))

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

}

//第三种方式
maxResult = {
    a,b in
    a > b ? a : b
    
}

//第四种
maxResult = {
    $0 > $1 ? $0:$1

}

//第五种
maxResult = {
   (a,b) -> Int in
    a > b ? a : b
}

print(maxResult(a: 3, b: 5))

 

 

 

 

 

 

 

 

 

 

 
 
posted @ 2015-11-03 17:03  DengHuiCheng  阅读(177)  评论(0编辑  收藏  举报