Swift

// 变量声明规则
// var(let)变量名 = 值
// 类型推断---根据给出的值对变量的类型进行判断

// *************************基本数据类型
var a = 10
var b = 20

// 关于类型推断,在32位系统整形自动推断为Int32
                 // 64位系统 Int64

let maxNumberOfStudent = 40

a++
++b

// 指定变量类型 语法(变量:类型)
// 如果给变量指定类型,可以暂时先不给初值,但是在第一次使用之前需要给值
var currentStudent:Int
currentStudent = 50
currentStudent++

// 浮点数自动类型推断为 Double---双精度
var score = 90.2
// 如果需要float类型,需要类型指定
var score1:Float = 90.3
// 由于Swift安全性,在swift中不支持隐式类型转换
// 必须转成相同类型进行加法操作
// 类型转换
var score3 = Float(score) + score1
var score4 = score + Double(score1)

// ****************字符串
// 字符串自动推断为 String类型
let name = "阳阳阳"
// 字符型
let char:Character = "a"
let name2:String = "nnn"
let loClass = "BJS150516"

// +运算符--- 重载运算符 源于C++ --- 用于运算符的拼接

let myyangyang = loClass + name


/// String与NSString类型不同


var strTest = "my name is XXX"
// String.Index 类型
// 获取字符串末尾位置
var indexCC = strTest.endIndex
// 获取前一个位置
indexCC.predecessor().predecessor().predecessor().predecessor()
//获取后一个位置
//indexCC.successor()


var strResult = strTest.substringToIndex(indexCC.predecessor())

// 转换为NSString类型
// as 强制声明
var ns1 = (strTest as NSString).substringToIndex(6)
var ns2 = (strTest as NSString).substringFromIndex(2)
var ns3 = (strTest as NSString).substringWithRange(NSMakeRange(4, 2))


print(ns3); print(ns3); print(ns3)

// 自带换行符
println(ns3); println(ns3)

var Test2 = "helllo world"
let index = advance(Test2.startIndex, 3)
let index2 = advance(Test2.endIndex, -3)

//var range = Range<String.index>(start:index,end:index2)

strResult = Test2.substringToIndex(index)

// 在swift中,变量/常亮名几乎支持所有的unicode编码的字符,除了数学中的符号,下划线,箭头
var 😊 = "阳阳阳"
😊

var 阳阳阳 = "yangyangyang"
阳阳阳


/**
*  数组 --- 在swift中,数组是Array类型,使用规则是,数组一般存放相同类型的数据
*/
var array = [1,2,3]
var array1 = [1,2,"3"]
var array2 = ["1","2","3"]

// 声明数组类型 语法: [参考类型]
var array4: [Int] = [1]


// 声明数组类型 语法: Array<参数类型>
var array5: Array<String>  = ["a"]

// 增加
array.append(4)
array.insert(6, atIndex: 2)
array.last
array.first

// 删除
//remove的返回值是被移除的元素
array.removeAtIndex(0)
array

// 更改


// 查询

array[0] = 8
array

var array6 = [22,33]

// +重载
array += array6

// 区域运算符符
// ...  1...2从1到2闭区间
// .. < 1...<2从1到2开区间

array[0...1]
array[0..<1]

array[0..<1] = [9,9,9] // 区间替换
array

array[3...5] = [1,2,3]
array
*/




/**
*  字典 --- 键值对数组
   字典使用潜规则 --- 键值类型相同     值类型相同    键和值的类型可以不同
*/

/*

var dictionary = ["key1":1,"key2":2]
// 声明字典类型语法1 [键值类型 : 值类型]
var dictionary2:[String: Int] = ["key3": 3]

// 语法2 Dictionary<键类型,值类型>
var dictionary3: Dictionary<String,Int> = ["key4":4]


// 查询

dictionary3["key4"]


// 如果可以存在则执行更新操作,key不存在则执行添加操作
// 字典中元素没有顺序
dictionary["key1"] = 11


// 删除
var indexDDD = dictionary.indexForKey("key2")
dictionary.removeAtIndex(indexDDD!)


// ******************可选类型 optional
// 只要想用nil,就必须将变量声明成可选类型
// var error = nil

// ?打包:因为已知此存储空间值可能为空,从swift安全性角度考虑,需要声明可选变量的开发人员负责此空间的安全
// 解包:当变量解包时,是否为空的情况要开发人员自主把控

var error :String? = nil
error = "Not Found!" // 赋值不需要使用!(解包)
error! += "!!!" // 使用可选变量的时候需要使用!(解包)
error

// **************元组
// 语法  源于关系型数据库的概念,在关系型数据库中,一条数据可以相当于是一个元组,里面包含不同类型的数据
// 元组可以作为函数返回值返回,处理多返回值类型

var status = (404,"Not Found!!!")
status.0
status.1


var status2:(num:Int,info:String) = status
status2.num
status2.info


*/


/**
*  分支语句
*/

/*

// if的条件 必须是bool值或者 bool表达式 --- 不能直接使用对象

var isOrNo = true // bool值必须使用true或者false
if isOrNo {

    println("true")

}else{

    println("true")
    
}


var count: Int? = nil
count = 20

if count > 10 {

    // 在输出函数中,使用\()进行变量的输出拼接
    println("count = \(count)")
}else{

    
}


if count == nil {

    println("count == nil")
}else{

    println("count = \(count)")
}


// 使用创建语句作为条件,编译时else分支会默认变量创建失败,不予使用
if let count2 = count{
    println("count2 = \(count2)")
}else{

    
}


// 为了swift的安全性,分支语句条件必须完整

// 循环
var number = 0
while number < 10{

    println("number = \(number)")
    number++
}


var number1 = 0


/// for循环
//var number2 = 10
for var number2 = 10; number2 > 0; number2-- {

    println("number2 = \(number2)")
    
}


/// do while 语句
var number3 = 10
do {

    number3--

}while number3>0



var array = ["1","2","3"]
for value in array {

    println("value = \(value)")
}


// 条件可以省略,分号不可以
var num = 0
for ; num < 10;{
    println(num)
    num++
}

// 使用元组 枚举数组时  元组的第一个元素代表的是数组中元素的小标,第二个元素代表的是数组的元素
var array7 = ["a"]
for (index,value) in enumerate(array7) {
    println(index)
    println(value)
}



var dict = ["key":"123"]
// 如果使用一个元for in 字典的话,将枚举出键值对
// 并且键值对以元组的形式体现,可以根据下标获取
for value in dict{
    
    println(value)
    value.0
    value.1
}

// 使用元组枚举字典的时候,不需要使用enumerate关键字
for (key,value) in dict {

    println(key)
    println(value)
}

// 占位符_,如果想忽略掉 元组中的值,使用占位符进行忽略 --- 忽略
for (_, value) in dict{

    println(value)
}


for (key, _) in dict{
    
    println(key)
}

// 区域占位符
for value in 1...10{

    println(value)

}

for value in array[0...1] {

    println(value)
}
*/

// ****************************switch


// 1.switch语句中,每个分支自带有break
// 2.switch语句,只要case将所有情况列举,default可以省略,必须包含所有可能情况
// 3.fallthrough使执行下一个分支,只在当前分支内有效
var point = (2,0)

switch point {
case (0,0):
    println("原点")
case (_,0):
    println("X轴")
    fallthrough
case (0,_):
    println("Y轴")
case(_,_):
    println("象限里")

}





// fallthrough 关键字不能向下执行包含变量的分支

var point2 = (3,0)
switch point2{

case (0,0):
    println("原点")
    
case (let x, 0):
    println("x轴 x = \(x)")
    
case(0,let y):
    println("y轴 y = \(y)")
    
case(let x,let y):
    
    println("象限内 x = \(x) y = \(y)")
    
//case(let x,let y) while x != 0 && y != 0:
//    
//    println("象限内 x = \(x) y = \(y)")
//    
//default:
//    println("others")
}



// switch与区间运算符的结合使用
var number2 = 20
switch number2{

case 0...10:
    println("0...10")
case 11...20:
    println("11...20")
case 21...30:
    println("21...100")
default:
    println(">100")
}



//for ... in 与分支的结合使用
for value in 1...10 {

    if value == 2{
    
        break // 跳出循环
        //continue // 跳出本次循环
    }
    println(value)
}




/// for  in循环与switch结合使用的时候,break将首先被识别为switch的break语句(作用:结束当前分支)如果想在分支内结束循环,需要为循环设置名称,作为break的标记,从而打断当前循环
var tempString = "abcdefghigklmnopqrstuvwxyz"
tempName: for tempStr in tempString{
    println(tempStr)
    switch tempStr{
    case "a","e","i","o","u":
        //continue tempName;
        println("元音:\(tempStr)")
        break tempName
    default:
        println("非元音")
    }

}




// 结构体和类
// 在swift里面,结构体被做了强化,几乎所有的数据类型都是结构体
// 相同:1.都可以定义属性 2.都可以定义方法 3.都可以定义构造器 init
//      4.都可以遵守协议 5.延展
// 不同点:1.结构体是值类型,类是引用类型 2.类可以被继承 3.类可以使用类型判断
//        4.类可以使用析构器deinit 5.一个类可以有多个引用
/*
// 结构体
struct Resolution {
    // 定义属性
    var height = 0
    var width = 0
}

// 结构体自动为我们的构造生成了构造器  init
let resolution1 = Resolution(height: 11, width: 12)
resolution1.height
resolution1.width

// 类
class Video {

    var resolution = Resolution(height: 10, width: 10)
    var frameRate = 0.1
}
// 类不会自动生成构造器,需要自己实现
let video = Video()
video.resolution
video.frameRate



/**
*  值类型和引用类型的区别
*/
var newResolution = resolution1
newResolution.height = 20
newResolution.height
resolution1.height


var newVideo = video
newVideo.frameRate = 0.5
newVideo.frameRate
video.frameRate


/**
*  构造器
*/
struct ResolutionA {
    var height = 0
    var width = 0
    // 构造器 --- 系统自动生成self.属性名
    init (gao:Int,kuan:Int){
        self.height = gao
        self.width = kuan
    }
}
var resolutionA = ResolutionA(gao: 10, kuan: 10)
resolutionA.height
resolutionA.width



class VideoA {
    var resolution = Resolution(height: 10, width: 10)
    var frameRate = 0.1
    // 构造器会自动生成外部参数名,构造器内实现对属性的赋值操作
    init(frameRate:Double,resolution:Resolution){
        self.frameRate = frameRate
        self.resolution = resolution
    }
}
var videoA = VideoA(frameRate: 0.2, resolution: Resolution(height: 10, width: 10))



/**
*  属性分为 计算属性和存储属性
*/
// 存储属性:存储类和结构体里面的常量或变量
// 计算属性:不作为存储功能使用,计算属性本身提供get set方法间接的计算出属性的值

struct Point {
    var x = 0
    var y = 0
}

struct Size {
    var width = 0
    var height = 0
}


struct Rect {
    var point = Point(x: 0, y: 0)
    var size = Size(width: 100, height: 100)
    // 计算属性
    var center:Point{
        get{// 计算属性的get方法 --- 用于计算属性的值
            let centerX = point.x + size.width/2
            let centerY = point.y + size.height/2
            return Point(x: centerX, y: centerY)
        }
        // set方法里会自动生成newValue(代表外部传入的数)
        // 不实现set 只读属性
        set{// 实现平移变化 宽高不变
            
            let x = newValue.x - size.width/2
            let y = newValue.y - size.height/2
            point.x = x
            point.y = y
        }
    }
}
var rect = Rect(point: Point(x: 0, y: 0), size: Size(width: 200, height: 200))
rect.center
rect.center = Point(x: 200, y: 200)
rect.center.x
rect.point
*/

// 定义方法
struct ResolutionB {
    var width = 0
    var height = 0
    // 结构体中方法实现体内部默认不能对结构体属性做更改
    // 如果有属性更改需求 需要在方法定义前面使用mutating关键字进行修饰,类方法没有限制
    mutating func hello(){
            println("你好,大胖子")
        func dasini(){
            println("打死你,小鹏鹏")
        }
        dasini()
        width = 20
    }
    // 使用static关键字修饰的方法为静态方法,调用时使用结构体本身进行调用
    static func helloWorld(){
    
        println("你好,中国")
    }
    
}

var resouB = ResolutionB(width: 10, height: 10)
resouB.hello()
// 使用static关键字修饰的方法为静态方法,调用时使用结构体本身进行调用
ResolutionB.helloWorld()



class VideoB {
    var framRate = 0.1
    func dj(){
        println("哈哈")
    }
    // 使用class修饰的方法为类方法,使用类本身调用
    static func dj(){
        println("哈哈,笨蛋")
    }
    // 类型属性  只能是计算属性
    class var name:String {
        get{
            return "毛毛"
        }
    }
}
var videoB = VideoB()
videoB.dj()
// 使用class修饰的方法为类方法,使用类本身调用
VideoB.dj()

 

posted @ 2015-09-06 23:04  百川hl  阅读(217)  评论(0编辑  收藏  举报