2014年推出的swift目前已来到了3.0,日趋稳定,这个是之前学习整理的关于swift的资料,分享给大家,希望有用,写的不足的地方还请见谅。

语言背景:
        Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序。
 
 语言优势:
  • 让应用开发更简单、更快、更稳定
  • 确保最终应用有着更好的质量
 
一些简单的特点:  
  1. 不用;号结束
  2. 方法和属性都是用.来使用  区别是方法后有( ),而属性没有( )
  3. 在 Swift 中使用 print() 替代 OC 中的 NSLog
  4. 在 Swift 中要实例化一个对象可以使用 类名() 的格式,与 OC 中的 alloc/init 等价
  5. OC 中的 [[类名 alloc] initWithXXX], [类名 类名WithXXX]在 Swift 中通常可以使用 类名(XXX: ) 找到对应的函数
  6. OC 中的 [UIColor redColor] 类方法,在 Swift 中通常可以使用 类名.XXX() 找到对应的函数
 
常量和变量
  • 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量
  • 使用let来定义常量,定义之后不可以修改
  • 使用var来定义变量,定义之后可以修改
  • Swift中类型要求异常严格,不一样的类型不能直接操作
  • Swift中所有类型的第一个字母都是大写的:Double, Int, Float, String
  • Swift中类型转换 类型(要转换的对象)   如果不想让Swift自动推导类型,可以在定义的时候指定类型
类型强转有2种方式 let aa:Float = 值     let aa = Float(变量/值)
 

Swift中基本运算
  • Swift中在进行基本运算时必须保证类型一致,否则会出错

    • 相同类型之间才可以进行运算
    • 因为Swift中没有隐式转换
  • 数据类型的转化
    • Int类型转成Double类型:Double(标识符)
    • Double类型转成Int类型:Int(标识符)
 
 

字符串
    • OC和Swift中字符串的区别

      • 在OC中字符串类型时NSString,在Swift中字符串类型是String
      • OC中字符串@"",Swift中字符串""
    • 使用 String 的原因
      • String 是一个结构体(栈里),性能更高
      • NSString 是一个 OC 对象(堆里),性能略差
      • String 支持直接遍历
      • Swift 提供了 StringNSString 之间的无缝转换
 
var str = "及法规和第三"
 
//遍历字符串
for i in str.characters{
    print(i)
}
//字符串的长度
let count = str.characters.count
 
//字符串与字符串的拼接
let a = "hhhhhhh"
let b = "jjjjjjj"
let c = a + " " + b
 
//非字符串(需转换成字符串)与字符串拼接
let a1 = 23
let b1 = "kkkk"
let c1 = String(a1) + b1
let c2 = "\(a1)"+b1  // "\()"在括号中可以传入任何类型然后转变成字符串
 
//字符串格式化
let p = 3.1415926
let format = String(format: "%f", p)
let format1 = String(format: "%d %f", arguments: [p,p])
 
 
//判断一个地址是否后缀是gif
//方法一
//转小写
let add1 = add.lowercaseString
//判断
add1.hasSuffix("gif")
//方法二
//将String转换NSString
let addr2 = add as NSString
let gif = addr2.substringFromIndex(add.characters.count - 3)
gif == "gif"
 

if语句
    Swift没有非0即真, Bool只有2个值 true表示真, false表示假
    Swift中 if 后面的条件可以不需要()
    Swift中if后面的代码即使只有一行,也不能省略{}
    if 后面的条件可以是 Bool类型或者Bool类型的表达式
 
 
let isNb = true
if !isNb {
    print("ture")
}
 
if(isNb){
    print("true")
}
 
let pass = "及格"
let fail = "不及格"
let score = 69
if score > 60{
    print(pass)
}else{
    print(fail)
}
 
//三目运算符  问号前面一定要有一个空格
let ss = score > 60 ?pass : fail
 

可选类型
     Swift为了解决忘记对没有值进行判断,搞了可选类型,可选类型的作用:时刻提示你,这个变量或常量有可能有值,也有可能没有,可选如果没有值为nil
    定义可选: 在普通的变量或常量的类型后面加?
 
 
//定义可选类型,不能直接使用,要先拆包,而拆包前需判断是否包为空,或者将包赋值
//两种写法,一般是第一种
let a:Int? = 1000
let a1 = Int?(1000)
 
//拆包: 变量! 操作时没有进行拆包判断的话,如果包为nil会出错
 
//拆包需要判断是否为nil
if a1 != nil{
    let sum1 = a1! + 100
}else{
    print("拆包为空")
}
 
//let aaa = a1这个式子里先将a1拆包,然后将拆出来的值赋给aaa
if let aaa = a1{
    let sum1 = aaa + 100
}else{
    print("拆包为空")
}

for循环
 
for var i = 0; i < 5; i++ {
   
}
 
for var i = 0;i < 10; i++ {
   
}
 
for i in 1...9{
    print(i)
}
 
for i1 in 0..<9{
    print(i1)
}
 
 0...5 范围(区间)运算符: 闭合运算符[a, b], 包含a也包含b: 0,1,2,3,4,5
 0..<5 范围(区间)运算符: 半闭合运算符[a,b),包含a不包含b: 0,1,2,3,4

switch语句
Swift中的每个case后面可以不加break,不会跑到下一个case去执行
    fallthrough: 贯穿,执行下一个case
    如果没有匹配完所有的条件必须使用default
    
let score = 77
switch score {
    case 90...100:
        print("优秀")
    case 80..<90:
        print("良好")
    case 76..<80:
        print("中上")
    case 70...75:
        print("中下")
    case 60..<70:
        print("及格")
        break
    default:
        print("不及格")
        break
}
 
swift中的switch可以匹配String, Float, Bool
 
let weekDay = "Thursday"
switch weekDay {
    case "Monday":
        print("星期一")
    case "Friday":
        print("星期五")
    default:
        print("未知")
}

数组
 OC中定义数组:
        NSArray *arr = [NSArray array];
        NSArray *arr2 = @[元素1, 元素2, 元素3];
 
    Swift中:
        var修饰的可变数组
        let修饰的是不可变数组
 
//数组
let arr = ["aaa","bbb","ccc"]//[String],元素是sting类型
let arr1 = ["aaa",123]//[NSObject],元素是对象,不建议这样使用
//指定数组类型
let arr2 :[Int] = [1,2,3]
//指定了就不能乱赋值
//let arr3 :[String] = ["aaa",123]
 
 
//定义空数组
let arr3 = [Int]()
let arr4:[Float] = []
 
//遍历数组
let arr5 = ["aaa","bbb","ccc"]
for var i = 0;i < arr5.count; i++ {
//    print(arr5[i])
}
 
for value in arr5{
//    print("value :\(value)")
//    print("value:\(value)")
}
 
//可同时获取下标和原始的值
for value in arr5.enumerate(){
//    print("下标:\(value.index) 元素:\(value.element)")
    /*
    下标:0 元素:aaa
    下标:1 元素:bbb
    下标:2 元素:ccc
    */
}
//另一种写法
for (a,b)in arr5.enumerate(){
//    print("下标:\(a),元素:\(b)")
}
 
//数组的增删改查
var arr6 = ["zhuzhuxia","dawang","xiaoming","55"]
//增加
arr6.append("xxx")//在最后添加
arr6.insert("yyy", atIndex: 0)//在指定下标添加
//删
arr6.removeLast()//删除最后一个
//arr6.removeAll()//删除全部
arr6.removeFirst()//删除第一个
arr6.removeAtIndex(2)//删除第几个
//修改
arr6[2] = "libai"
 
//查看
arr6.count//数组的元素个数
arr6.isEmpty//判断是否为空
 
//数组相加
let arr7 = [1,2]
let arr8 = [4,5]
let arr9 = ["aa","bb"]
let arr10 = arr7 + arr8  //[1, 2, 4, 5]
//不同类型的数组不能相加
//let arr11 = arr8 +arr9

字典
let dict  = ["name":"libai","age":55] //[String : NSObject]字典key是String,value是NSObjct类型
var dict1 = ["name":"libai","place":"taiwan"]//[String : String]
//指定字典类型
let dict2 :[String:String] = ["name":"gg","xxx":"ggg"]
 
 
//定义空字典
let dict3:[String:String] = [:]
 
let dict7 = [String:String]()
let dict4 = [String : NSString]()
 
let dict5 = [String:NSObject]()
let dict6 = [String:AnyObject]()
 
//通过key值获取value
let name = dict1["name"]
//遍历
for obj in dict1{
    print("key = \(obj.0),value = \(obj.1)")
}
for(key1,key2) in dict1{
    print("key = \(key1),value = \(key2)")
}
//增删改查
//增
dict1["ee"] = "什么?"
print(dict1)
//删
dict1["place"] = nil
dict1.removeValueForKey("ee")
//改
dict1["place"] = "guangzhou"
 
//字典不能相加
let dict9 = ["name": "a"]
let dict10 = ["age": "55"]
//let dict11 = dict9 + dict10
//print(dict1)

枚举
      /*
    OC定义枚举类型:
        enum Season {
            Spring = 1,
            Summer = 2,
            Autumn = 20,
            Winter
        };
    定义枚举变量
        enum Season s = Spring;
*/
 
// 定义枚举类型
enum Season {
    case Spring
    case Summer
    case Autumn
    case Winter
}
 
// 定义枚举变量: 枚举名称.成员名称
var s = Season.Spring
s = Season.Summer
 
// 当要修改枚举可以直接 .成员名称
s = .Summer
s = .Winter
 
// 枚举switch
switch s {
    case Season.Spring:
        print("春天")
    case Season.Summer:
        print("夏天")
    case .Autumn:
        print("秋天")
    case .Winter:
        print("冬天")
}
 
// 枚举原始值
enum Direction: Int {
    case east = 1
    case south = 10
    case west = 66
    case north = 88
}
 
// 创建枚举常量
let dir1 = Direction.north
// 获取枚举的原始值
print(dir1.rawValue)
 
// 通过原始值创建枚举常量
let dir2 = Direction(rawValue: 88)
 
print(dir2)
 
if let dir3 = dir2 {
    switch dir3 {
    case Direction.east:
        print("东")
    case Direction.south:
        print("南")
    case Direction.west:
        print("西")
    case Direction.north:
        print("北")
    }
} else {
    print("枚举没有值")
}

函数
         C语言函数:
        int sum(int a, int b) {
            return a + b
        }
        调用函数: int c = sum(10, 5);

Swift中定义函数:
        func: 关键字
        func 函数名称(函数的形参数: 参数类型, ...) -> 返回值类型 {
            函数代码
        }

函数没有返回值:
        1.返回值什么都不写
        2. -> Void

        3. -> ()
 
// 函数有返回值
func sum(a: Int, b: Int) -> Int {
    return a + b
}
// 函数没有返回值
func sayHello() {
    print("hello world")
}
 
// 调用函数
let c = sum(10, b: 5)
print(c)
 
sayHello()

// 自定义外部参数名: 在形参前面再添加一个名称就是外部参数名
func addStudent(stu_name name: String, age: Int, no: Int) {
    print("添加学生: name = \(name), age = \(age), no = \(no)")
}

// 10000行代码
// 调用
// 外部参数名,作用提示我们每个参数的作用,默认第一个参数不生成外部参数名,其他参数的外部参数名和形参一样
addStudent(stu_name: "liudehua", age: 55, no: 55)

func addStudent2(stu_name name: String, stu_age age: Int, stu_no no: Int) {
    print("添加学生: name = \(name), age = \(age), no = \(no)")
}

addStudent2(stu_name: "liudehua", stu_age: 55, stu_no: 55)

闭包
      和OC的Block类似,都是一段先准备好的代码,在需要的时候执行,函数其实也是这样 Block和函数最大的区别:Block可以作为参数传递
    闭包表达式的格式:
        //  in 必须要的,用于区分
        { (形参: 类型, 形参: 类型) -> 返回值 in
            // 闭包代码
        }
     // 1.定义闭包常量:无参数无返回值
        let coluse = { () -> Void in
            print("我是一个闭包")
        }
       
        // 2.调用闭包
        coluse()
       
        // 1.定义一个有参数的闭包
        // 闭包类型: (Int, Int) -> Int
        let coluse2 = { (a: Int, b: Int) -> Int in
            return a + b
        }
       
        // 调用闭包
        let c = coluse2(10, 5)
        print(c)

 待续。。。
 
 
 

swift小结01--基础篇的更多相关文章

  1. iOS开发swift语法0基础篇—————(swift技术交流群:361513739)

    iOS开发之swift语法0基础篇:点击打开链接  swift技术交流QQ群361513739

  2. swift小结02-基础篇

    闭包      类似于 OC 中的 Block,是一段预先定义好的代码,在需要时执行   闭包表达式格式:  { (形参名称1: 形参类型1, 形参名称2: 形参类型2, ...) -> 返回值 ...

  3. .net core 3.0 Signalr - 01 基础篇

    因为将signalr作为单独的站点,此处需要建立两个项目,一个专门用于signalr作为推送项目,一个客户端(实际的业务项目) ## 基础知识速览 ### Clients对象属性 | 属性 | 描述 ...

  4. Javascript DOM 01 基础篇

    DOM基础   DOM是什么        答:文件对象模型(Document Object Model,简称DOM),DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构!来自网络 ...

  5. Swift 学习- 01 -- 基础部分

    print("世界,你好") var myVariable = 42 myVariable = 50 let myConstant = 42 let implicitinteger ...

  6. 01: tornado基础篇

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 Torn ...

  7. 01: Django基础篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  8. 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班? | 百篇博客分析OpenHarmony源码 | v22.01

    百篇博客系列篇.本篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在 ...

  9. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

随机推荐

  1. IOS webview中cookie的读取与保存-b

    Cookie 的读取 将它放在 webViewDidFinishLoad 开始后执行 NSArray *nCookies = [[NSHTTPCookieStorage sharedHTTPCooki ...

  2. iPhone不同机型适配 6/6plus --备用

     机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果 ...

  3. int 占一个机器字长

    int与short int是不一样的. C++标准规定,int占一个机器字长.在32位系统中int占32位,也就是4个字节, 而在老式的16位系统中,int占16位,即2个字节. 而C++标准中只限制 ...

  4. (转)未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService~~导出!解决方案。

    今天刚到公司,打开VS2012准备些个小程序练练手,结果打开C#控制台程序创建时弹出个出错警告,于是呼赶紧跑到百度娘那里问问. 百度一番之后,找到了两篇文章: vs2012建立c++项目为啥会这样? ...

  5. 怎么样删除eclipse已经记录svn的地址

    eclipse-->window-->show view-->svn选项卡中选中要删除的svn链接,点击右键废弃即可. 1.

  6. PHP curl传输文件的版本兼容性

    /** * 存储文件到远程服务器 * * @param string $filePath * 文件绝对路径 * @param string $fileSaveUrl * 存储的远程目标地址 * @pa ...

  7. [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)

    在c++中我们可以多继承来实现代码复用和封装使程序更加简练.在objective-c中只能单继承,不能多继承,那么除了协议protocol之外,我们可以实现类似多继承的一个方法就是,分类(catego ...

  8. Oracle - Unprocessed Material

    create table kol.MTL_MATERIAL_TRANS_TMP_140325 as select * from MTL_MATERIAL_TRANSACTIONS_TEMP ; upd ...

  9. [LeetCode#277] Find the Celebrity

    Problem: Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there ma ...

  10. m2e使用问题——发布web项目时lib目录下的jar包未发布

    解决过程如下: 在项目上点右键查看properties—>Deployment Assembly,看Deploy Path这项上是否缺少WEB-INF/lib这一项. 相关操作截图如下: