Swift4.0 基础语法部分【简述】

一、swift特性
  1. Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。
  2. Swift 使用变量来进行存储并通过变量名来关联对应的值。(与C语言类似)
  3. Swift 中,如果要处理的值不需要改变,那使用常量可以让代码更加安全并且更清晰地表达意图。(能用常量就用常量)
 
二、常量与变量
  1. 使用let表示常量、var表示变量。(如果代码中有不需要改变的值,请使用 let 关键字将它声明为常量。只将需要改变的值声明为变量 var 关键字)
  2. 类型标注
  3. var str1: String //(声明一个String类型,名为str1的变量)。一般来说在有赋初值的情况下不需要标注类型,swift会根据所赋的值推断出类型。
  4. 如需定义同一类型的多个变量可采用 : 
  5. var zhao, qian, sun, li: String
  6. Swift中在进行基本运算时必须保证类型一致,否则会出错,相同类型之间才可以进行运算,Swift中没有隐式转换
 
三、字符串
var str = "Hello, playground"

//for c in str.characters {
//    print(c)
//}

//字符串的拼接-格式化
let number_a = 132
let number_b = 100
let number_str = String (number_a + number_b)
let str1 = "this string is \(number_a) and \(number_b)"
let str2 = String.init(format: "%04d:%05d", number_a,number_b)

//字符串截取-转位NSString来操作
let str3 = (str as NSString).substring(to: 2)
let str4 = (str as NSString).substring(from: 4)
let range = NSRange.init(location: 2, length: 3)
let str5 = (str as NSString).substring(with: range)

//字符串长度的判断
str.lengthOfBytes(using: .utf8)
let str6:String = "jhhgftytyiuh09887gybgjgv"
str6.lengthOfBytes(using: .utf8)

//let strLength = lengthOfString(str7:str6)
//
//func lengthOfString(str7:String) -> (Int) {
//    guard str7.lengthOfBytes(using: .utf8) == 0 else {
//        return str7.lengthOfBytes(using: .utf8)
//    }
//    return 0
//}
 
四、数组
//数组 Array let修饰不可变数组、var修饰可变数组
//定义一个可变数组
var array1:Array<String>
var array2:[String]
//定义一个不可变数组
let array3 = [1, 2, 3, 4, 8]//直接初始化的话通过值去推断array3的类型
let array4 = [1, 2, 3, 4, "i"] as [Any]
let array5:[NSObject] = [1 as NSObject, 2 as NSObject, "x" as NSObject, 3.14 as NSObject]

//声明数组时、需要初始化才能使用。
//先声明在初始化
var array6:Array<String>
array6 = ["1", "2", "3"]
array6 = Array()

//声明的同时并初始化
var array7:[String] = [String]()
var array8:Array<String> = Array()
var array9 = [1, 2, 3, 4, 5]

//Array增
array9.append(6)//增到最后位

//Array插
array9.insert(4000, at: 1)

//Array改
array9[1] = 10086

//Array删
array9.remove(at: 2)//删除第3个元素3
array9.removeAll()//清空

//取值
array9[4]

//遍历全部
for item in array9 {
    print(item)
}

//遍历部分
for item in array9[0...3] {
    print(item)
}

for item in array9[0..<3] {
    print(item)
}

//数组的合并 用+ 确保类型一致才可以
let array10 = ["1", "2", "3"]
let array11 = ["A", "B", "C"]
let array12 = array10 + array11
 
四、字典
//let修饰不可变字典 var修饰可变字典
//定义一个不可变字典、直接定义
let dict1 = ["a":"A", "b":"B", "c":"C"]
//取值
dict1["a"]

//定义一个可变字典并初始化
var dict2:[String: NSObject] = [String: NSObject]()
var dict3:Dictionary<String, Int> = Dictionary()
var dict4 = ["a":"A", "b":"B", "c":"C"]

//先定义后初始化
var dict5:Dictionary<String, String>
dict5 = ["a":"A", "b":"B", "c":"C"]

//增
dict5["e"] = "E"
dict5["爱"] = "❤️"
//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C", "爱": "❤️"]

//改
dict5["爱"] = "🐷"
//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C", "爱": "🐷"]

//删
dict5.removeValue(forKey: "爱")
//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C"]

//查 - 用键查值
dict5["e"]

//清空
dict5.removeAll()

var dict6:Dictionary<String, String>
dict6 = ["1":"a","2":"b","3":"c","4":"d","5":"e","6":"f"]

//遍历字典的键
for key in dict6.keys {
    print(key)
}

//遍历值
for value in dict6.values {
    print(value)
}

//遍历所有的键值对
for (k, v) in dict6 {
    print(k, v)
}

//两字典的合并
var dict7 = ["一":"甲", "二":"已","三":"丙"]
var dict8 = ["1":"A","2":"B","3":"C"]


//不能和数组那样直接+ 需要遍历一个字典将键值加到另外一个字典上
for (key, value) in dict7 {
    dict8[key] = value
}
//dict8 = ["三": "丙", "2": "B", "1": "A", "二": "已", "一": "甲", "3": “C"]
 
五、元组(Swift特有的)
//写法一:
let tump1 = ("liuhuakun", 27, "GD", 173.5)
tump1.0 //"liuhuakun"
tump1.3 //173.5

//写法二:
let tump2 = (name:"liuhuakun", age:28, address:"GD", height:173.5)
tump2.name //"liuhuakun"
tump2.height //173.5

//写法三
let (name, age) = ("liuhuakun", 28)
name //173.5
age //28
 
 
七、可选类型 Optional
//可选类型 - Optional值
//OC中如果有暂时不使用的变量、可以赋值为0(基础数据类型)或赋值为nil(对象类型)
//Swift中nil是一个特殊类型,与真实的变量类型不一致不能被复制(Swift为强类型语言)。但开发中确实需要用到赋值为nil,这就引入了可选类型Optional(空值或有值)

//var str1:String = nil//报错-类型不匹配不能被赋值
//写法1
var str1:Optional<String> = nil
//写法2
var str2:String? = nil //语法糖

//解包 - 当确保当前可选值有值时可解包
var str3:String? = nil

str3 = "hello"
//print(str3) //Optional("hello")
//print(str3!) //hello

//若str3为空时解包则报错
str3 = nil
//print(str3) //nil
//print(str3!)//报错

//1.强制解包、2.隐式解包、3.可选绑定
//1.强制解包
var a:Int? = nil
a = 7
let aa = a! //这里对a进行强制解包 - 强制解包后 aa为7 不强制解包的话 aa为Optional(7)
print(aa)

//2.隐式解包 - 还是不太理解
var b:Int! = nil //这里声明对b要进行隐式解包
b = 8
let bb = b
print(bb as Any)

//可选绑定 - 在 if里面可以方便操作 当前可选值
var str4:String? = nil
str4 = "hello"

if let string = str4 {
    print(string)
}else {
    print("nil")
}
 
八、函数
//默认下函数是值传递 - 值传递 函数内部是不能去改变参数的值的。
func myFunc1(a:Int, b:Int) -> Int {
    return a+b
}

var a = 3
var b = 7
myFunc1(a: a, b: b)

//函数的指针传递 inout - 指针传递 函数内部是可以改变参数值的
func myFunc2( a:inout Int, b:inout Int) -> Int {
    a = a*b //a = 63
    b = b*b //b = 81
    return a*b //a*b = 5103
}

var x = 7
var y = 9
myFunc2(a: &x, b: &y)

x //x=63,此时x的值在函数内部被改变 x在外部也被改变了,因为传入的是x的指针地址
y //y=81,此时y的值在函数内部被改变 y在外部也被改变了,因为传入的是x的指针地址
 
九、类
//类的使用
/// class为类关键字、myClass类名、:父类(可以没有父类)
class myClass:NSObject {
    /// swift中类的属性有多种
    //1、存储属性:存储实例的常量和变量
    //2、计算属性:通过某种计算方式得出的属性
    //3、类属性:与整个类相关的属性
   
    //1、存储属性
    var a:Int = 88
    var b:Int = 99
    var name = "xiaohong"
   
    //2、计算属性
    var totalInt:Int {
        get {
            return (a + b)/2
        }
       
        // 没有意义,因为之后获取值时依然是计算得到的
        // newValue是系统分配的变量名,内部存储着新值
        set {
            self.totalInt = newValue
        }
    }
   
    //3、类属性
    //类属性是与类相关联的,而不是与类的实例相关联,类属性的设置和修改,需要通过类来完成,类属性使用static来修饰
    static var appleCount:Int = 100
   
   
    func myCount(num1:Int, num2:Int ) -> Int {
        return num1 + num2
    }
}

//1、外部实例类的对象
let my = myClass()

//2、外部调用存储属性和计算属性
//my.a = 5 //外部可赋值改变存储属性a的值
//my.b = 7 //外部可赋值改变存储属性b的值
print(my.name) //xiaohong
my.myCount(num1: my.a, num2: my.b) //187
my.totalInt //93

//3、外部调用类属性
//my.appleCount //用类的实例去调用类属性是不可以调用的
myClass.appleCount //只能通过类本身去调用带 static的类属性
myClass.appleCount = 99
print(myClass.appleCount) //99
 
///监听属性的变化
/*
1、在OC中我们可以重写set方法来监听属性的改变。
2、在Swift中可以通过属性观察者来监听和响应属性值的变化,通常是监听存储属性和类属性的改变。
(对于计算属性,我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应这种值的变化)
3、willSet:在属性值被存储之前设置,此时新属性值作为一个常量参数被传入,该参数名默认为newValue,
我们可以自己定义该参数名;
didSet:在新属性值被存储后立即调用,与willSet相同,此时传入的是属性的旧值,默认参数名为oldValue;
4、willSet与didSet只有在属性第一次被设置时才会调用,在初始化时,不会去调用这些监听方法*/

class Student :NSObject {
    var name: String? {
        willSet(new) {//属性即将改变、还未改变时调用
            print("name=\(String(describing: name))")
            print("new=\(String(describing: new))")
        }
        didSet(old) {//属性已经改变时调用
            print("name=\(String(describing: name))")
            print("old=\(String(describing: old))")
        }
    }
}

let stu = Student()
stu.name = "x"
stu.name = "huakun"
stu.name = "hakan"

/*
 打印出来的信息:
-----------------------------------
 name=nil
 new=Optional("x")
 name=Optional("x")
 old=nil
-----------------------------------
 name=Optional("x")
 new=Optional("huakun")
 name=Optional("huakun")
 old=Optional("x”)
-----------------------------------
 name=Optional("huakun")
 new=Optional("hakan")
 name=Optional("hakan")
 old=Optional("huakun”)
-----------------------------------
 */
 
posted @ 2018-01-12 17:32  isHakan  阅读(271)  评论(0编辑  收藏  举报