• 免费下载地址:https://itunes.apple.com/cn/app/id1320746678◈ 不看视频不看书,手把手带您学习Swift语言◈ 利用手指来互动式学习Swift 4.0◈ 无痛上手,比观看视频、阅读书籍更加有趣、更加有效的学习方式 ◈ 变...

    免费下载地址:https://itunes.apple.com/cn/app/id1320746678

    ◈ 不看视频不看书,手把手带您学习Swift语言
    ◈ 利用手指来互动式学习Swift 4.0
    ◈ 无痛上手,比观看视频、阅读书籍更加有趣、更加有效的学习方式 
    ◈ 变被动学习为主动学习,真正的Swift语言一点通,是您学习Swift语言的最佳方式


    【Swift4互动教程是什么】
    Swift4互动教程是一款简单、有趣、互动式的学习Swift的新工具。是第一款互动式学习Swift的工具。此应用将向您展示基于Swift 4.0的绝大部分功能点。
    就像有一名专业的教师手把手地教您最新、最实用的Swift编程技巧。您将学会怎么使用Xcode来快速、直接地表达您的想法与创意。
    另外,本应用119节课都包含互动模式,同时也支持观赏模式,当您在互动式学习中肢体疲劳时,可以切换至此模式,这样意味着您同时也拥有了119节教学影片。 

    【Swift4互动教程主要包括哪些内容】
    包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时还讲解了运算符和表达式、流程控制语句、字符和字符串、集合类型、函数和闭包。此外,Swift面向对象的枚举、结构体、类,以及内存管理、协议与抽象类型、错误处理、链式编程、iOS开发中的常见概念等内容也有所涉及。在第八章我们使用Swift语言实现了栈、队列、二叉树等数据结构,还实现了常见的8种排序算法。最后一章则包含了证书的创建、项目的架构、开发、打包、上传和发布一整套流程,供您学以致用。 部分内容如下:
    - 使用Playground学习Swift
    - Swift语言中的常量和变量
    - Swift的标识符和关键字
    - Swift的表达式Expressions
    - 给Swift代码添加注释语句
    - Swift的几个打印输出语句
    - 在控制台输出类的实例及其属性

    - Swift的(Boolean)布尔类型
    - Swift的(Int)整形类型
    - Swift的(Float)和(Double)浮点类型
    - 字符串(String)及对字符(Characters)的遍历
    - Swift字符串的使用详解
    - Swift中的元组(Tuples)
    - 基本数据类型之间的互相转换
    - 一维数组(Array)的使用详解
    - 多维数组的创建和遍历
    - 数组的几种遍历方式
    - 字典(Dictionary)的使用详解

    - Swift的一元、二元和三元运算符
    - Swift的位运算符和防溢出运算符
    - 比较运算符和区间运算符
    - 使用for-in循环遍历数组
    - 使用循环语句获得序列中的最小值
    - switch-case语句的实例解析
    - continue、break和fallthrough的区别
    - while和repeat-where循环语句
    - if和if-let判断语句的使用解析

    - 函数的参数和返回值
    - 函数的外部参数名
    - 创建拥有任意数量参数的函数
    - 函数的输入输出inout参数解析
    - 给函数的参数设置默认的取值
    - 使用函数作为另一个函数的参数
    - 函数类型的解析
    - 使用函数类型作为函数的返回类型
    - 函数可以拥有多个返回值
    - 藏在函数内部的函数
    - 递归函数的使用解析
    - Swift那些非常实用的内部函数

    - Swift的枚举(enum)类型及遍历
    - 给枚举类型添加方法
    - Swift的结构(struct)类型及其下标(subscript)
    - 类(class)的初始化方法、属性和方法
    - 类的引用(reference)特征
    - 类和结构两个类型的比较
    - 类属性的set和get方法解析
    - 类属性的willSet和didSet方法解析
    - 类析构方法(deinit)的使用
    - 给类添加下标(subscript)
    - 类的静态方法(class func)
    - 将一个类的实例作为另一个类的属性
    - 类的继承以及方法的重写(override)
    - 父类在实例类型转化时的应用
    - 使用is语句检查实例的类型
    - 使用Any表示任意值类型

    - 使用扩展(extension)扩展类型的属性
    - 使用extension对方法进行扩展
    - 使用协议(protocol)进行方法的声明
    - 问号?和感叹号!的用法解析
    - Swift中的闭包(Closure)详解
    - Swift语言中的泛型编程
    - Swift的do-try-catch错误处理模式
    - 实例的引用特征和Swift的内存管理
    - 实例的交叉引用和弱引用(weak)
    - Swift的懒加载(lazy initialization)使用解析

    - 范围Range、ClosedRange和NSRange的使用
    - 点CGPoint和变形CGAffineTransform的使用
    - 尺寸CGSize的使用详解
    - 范围CGRect的使用详解
    - 使用NSString对字符串进行各种操作
    - 日期Date和DateFormatter日期的格式化
    - 日历Calendar和日期组件DateComponents
    - 日历Calendar和时区TimeZone
    - 使用定时组件Timer执行定时任务
    - 使用UserDefaults和归档方式存取用户数据
    - 路径URL的使用详解
    - 使用DispatchGroup管理线程组
    - 使用UIScreen查询设备屏幕信息
    - 使用UIColor设置界面组件的颜色属性

    - Swift语言中的两种单例模式
    - Swift语言中的三种消息传递模式
    - 闭包在定时任务、动画和线程中的使用
    - 通过protocol在两个对象中进行消息传递
    - 通过间接代理进行对象间的消息传递
    - 通过属性进行对象间的消息传递
    - 使用通知的方法进行对象间的数据传递
    - 使用performSegue在故事板页面之间进行数据传递
    - Swift中的栈Stack和队列Queue详解
    - Swift中的链表LinkedList详解
    - 使用Swift创建一个二叉树BinaryTreeNode
    - 冒泡排序算法的Swift实现
    - 选择排序算法的Swift实现
    - 快速排序算法的Swift实现
    - 插入排序算法的Swift实现
    - 希尔排序算法的Swift实现
    - 归并排序算法的Swift实现
    - 基数排序算法的Swift实现
    - 堆排序算法的Swift实现

    - 在iTunesConnect中创建产品ACTHelper
    - 在Xcode9中创建新项目ACTHelper
    - 创建开发证书和发布证书及其它文件
    - 在ACTHelper项目中使用CocoaPod管理插件
    - 创建BaseViewController作为控制器的基类
    - 创建App的欢迎页面
    - 登陆页面:创建自定义视图及相关组件
    - 登陆页面:创建自定义表单Row以及基控制器
    - 创建用户登陆页面
    - 用户注册账号信息的输入和短信验证码
    - 用户注册头像和科目信息输入页面
    - 用户注册考试成绩输入页面及相关自定义组件
    - 试题解析页面及相关自定义组件
    - 试题科目列表及答案列表等自定义组件
    - 创建试题解析列表页面和试卷选择页面
    - 创建试题详情页面和浮动菜单组件
    - 试题原文显示页面和数学公式的渲染
    - 账号设置列表页面和分享、反馈、评分功能
    - 会员个人信息设置页面和登出功能
    - App发布前的设置以及打包、上传和提交审核
    - 更多内容等待您的探索!!!










    【相关互动教程】
    Xcode9.0互动教程
    https://itunes.apple.com/cn/app/id1063100471

    iOS开发中的神兵利器
    https://itunes.apple.com/cn/app/id1209739676

    Excel2016互动教程
    https://itunes.apple.com/cn/app/id1090726089

    Photoshop CC互动教程精装版
    https://itunes.apple.com/cn/app/id822431555

    Illustrator CC互动教程
    https://itunes.apple.com/cn/app/id1005557436

    Photoshop CS5互动教程完全版:
    https://itunes.apple.com/cn/app/id976566883

    Photoshop脚本互动教程
    https://itunes.apple.com/cn/app/id926846601
    展开全文
  • The Swift Programming Language 4.0 中文版学习笔记 11. 基础部分注释嵌套注释: /* A /* B */ /常量和变量常量和变量名可以使用Unicode字符来命名,但不能包含数学符号,箭头,保留的(或者非法的)Unicode码位...

    The Swift Programming Language 4.0 中文版学习笔记 1

    1. 基础部分

    注释

    嵌套注释:
    /* A
    /* B */
    /

    常量和变量

    常量和变量名可以使用Unicode字符来命名,但不能包含数学符号,箭头,保留的(或者非法的)Unicode码位,连线与制表符。也不能以数字开头。

    常量和变量一旦声明为确定的类型,即不能改变其存储的值的类型。同时,常量和变量不能互转。

    数字

    除非需要特定长度的整数,一般来说使用Int就够了,这样可以提供代码一致性和可复用性。

    尽量不要使用UInt,除非需要存储一个和当前平台原生字长相同的无符号整数。否则,最好使用Int,即使要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断。

    Double类型的精确度高于Float,选择哪个类型取决于代码需要处理的值的范围,在两种类型都匹配的情况下,优先选择Double

    类型推断

    数字类字面量可由编译器推断类型,而数字类常量和变量必须显式转换为其他类型。

    类型别名

    类型别名typealias就是给现有类型定义另一个名字。

    元组

    可以把任何顺序的类型组合成一个元组,这个元组可以包含所有类型。

    可以将一个元组的内容分解为单独的常量和变量。如果只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记。

    定义元组的时候,可以给单个元素命名。

    let http200Status = (statusCode: 200, description: “OK")
    print(“status code: \(http200Status.statusCode), description: \(http200Status.1)”)
    let (justTheStatusCode, _) = http200Status

    可选类型

    可选类型可以暗示任意类型的值缺失,并不需要一个如Objective-C中的NSNotFound这样的特殊值来标记非对象类型。

    可以给可选变量赋值为nil来表示它没有值,nil不能用于非可选的常量和变量。

    Swift的nil和Objective-C的nil并不一样。后者是一个指向不存在对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。

    可选绑定

    使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含值就把值赋值给一个临时常量/变量。可选绑定可以用在ifwhile语句中。

    注意:在if条件语句中使用常量/变量来创建一个可选绑定,仅在if语句的句中(body)中才能获取到值。相反,在guard语句中使用常量/变量来创建一个可选绑定,仅在guard语句外且在语句后才能获取到值。

    隐式解析可选类型

    有时在程序架构中,第一次赋值之后可以确定一个可选类型总会有值。这种情况下,每次都要判断和解析可选类型是非常低效的。这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用做可选类型的后面的问号(String?)改为感叹号(String!)来声明一个隐式解析可选类型。

    注意:只在确定一个变量不可能变为nil时才使用隐式解析可选类型。否则在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误;正如和没有值的普通可选类型后面加一个惊叹号一样。

    2. 基本运算

    空合运算符(Nil Coalescing Operator)

    空合运算符(a ?? b)将对可选类型a进行空判断,如果包含一个值就进行解封,否则就返回一个默认值b。注意这里,a 必须是可选类型, 默认值b的类型必须与a存储值的类型保持一致。

    区间运算符(Range Operators)

    a…b // 闭区间运算符
    a..<b // 半开区间运算符
    array[2…] // 单侧区间1
    array[…2] // 单侧区间2

    3. 字符串和字符

    多行字符串字面量

    由一对三个双引号"""包裹着文本,可实现跨越多行的字符串。注意:从开启引号当前行之后的第一行开始,到关闭引号当前行之前的一行为止。可以在行尾写一个反斜杠(\)作为续行符来实现增强代码可读性且避免换行。

    关闭引号当前行之前的空白字符串告诉Swift编译器其他各行多少空白字符串需要忽略。

    字符串是值类型

    Swift的String是值类型。拷贝的方式保证了在函数/方法中传递的是字符串的值。

    连接字符串和字符

    字符串支持的运算符包括+ += == !=,也可以使用append()方法将一个字符附加到一个字符串变量的尾部。

    字符串插值

    字符串插值是构建新字符串的方式之一,可以包含常量、变量、字面量和表达式。

    4. 集合类型(Collection Types)

    Swift语言提供Array(有序数据集合)、Set(无序不重复数据集合)、 Dictionary(无序键值对集合)三种基本集合类型用来存储集合数据。它们存储的数据类型必须明确。

    集合的可变性

    如果集合赋值给一个变量,则这个集合是可变的;否则分配给一个常量,则是不可变的。

    数组(Array)

    数组Array支持使用加法运算符+和加法赋值运算符+=[]是空数组。

    注意:自定义类型通过实现Hashable协议,可以作为集合的值的类型或者是字典的键的类型。实现Hashable协议,需要提供一个类型为Int的可读属性hashValue

    集合(Set)

    你可以高效地完成Set的一些基本操作,比如把两个集合组合到一起,判断两个集合共有元素,或者判断两个集合是否全包含,部分包含或者不相交。

    字典(Dictionary)

    通过访问keys或者values属性,我们也可以遍历字典的键或者值。

    5. 控制流

    Swift提供了多种流程控制结构,包括可以多次执行任务的while/(repeat-while)循环,基于特定条件选择执行不同代码分支的if、guard和switch语句,还有控制流程跳转到其他代码位置的break和continue语句。
    Swift 还提供了for-in循环,用来更简单地遍历数组(Array),字典(Dictionary),区间(Range),字符串(String)和其他序列类型。
    Swift 的switch语句比 C 语言中更加强大。case 还可以匹配很多不同的模式,包括范围匹配,元组(tuple)和特定类型匹配。switch语句的 case 中匹配的值可以声明为临时常量或变量,在 case 作用域内使用,也可以配合where来描述更复杂的匹配条件。

    Switch

    区间匹配

    case 分支的模式也可以是一个值的区间。

    元组

    我们可以使用元组在同一个switch语句中测试多个值。元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有可能的值。

    值绑定(Value Bindings)

    case 分支允许将匹配的值声明为临时常量或变量,并且在case分支体内使用 —— 这种行为被称为值绑定(value binding)。

    case 分支的模式可以使用where语句来判断额外的条件。

    复合匹配

    当多个条件可以使用同一种方法来处理时,可以将这几种可能放在同一个case后面,并且用逗号隔开。

    控制转移语句

    控制转移语句改变代码的执行顺序,通过它可以实现代码的跳转。

    Swift有五种控制转移语句:

    • continue
    • break
    • fallthrough
    • return
    • throw

    在 Swift 里,switch语句不会从上一个 case 分支跳转到下一个 case 分支中。

    相比之下,C 语言要求你显式地插入break语句到每个 case 分支的末尾来阻止自动落入到下一个 case 分支中。

    如果你确实需要 C 风格的贯穿的特性,你可以在每个需要该特性的 case 分支中使用fallthrough关键字。

    可以使用标签(statement label)来标记一个循环体或者条件语句,对于一个条件语句,你可以使用break加标签的方式,来结束这个被标记的语句。对于一个循环语句,你可以使用break或者continue加标签,来结束或者继续这条被标记语句的执行。

    例如,针对循环体的标签:

    label name: while condition { statements }

    提前退出

    if语句一样,guard的执行取决于一个表达式的布尔值。我们可以使用guard语句来要求条件必须为真时,以执行guard语句后的代码。不同于if语句,一个guard语句总是有一个else从句,如果条件不为真则执行else从句中的代码。

    guard let/var condition else {
        return // break/continue/throw/fatalError()
    }

    相比于可以实现同样功能的if语句,按需使用guard语句会提升我们代码的可读性。它可以使你的代码连贯的被执行而不需要将它包在else块中,它可以使你在紧邻条件判断的地方,处理违规的情况。

    检测API可用性

    if #available(platform name version, ..., *) {
        APIs 可用,语句将执行
    } else {
        APIs 不可用,语句将不执行
    }

    6. 函数(Functions)


    1. The Swift Programming Language http://wiki.jikexueyuan.com/project/swift/
    展开全文
  • Swift4.0入门视频教程,课程内容包含Swift入门知识、数据类型(元组、Dictionary、运算符)、流程控制、函数、类与对象、扩展协议、常见概念、实用进阶、案例实战。 1、119节大容量课程:包含了Swift4.0语言大部分...
    Swift4.0入门实例视频教程—4744人已学习 
    课程介绍    
    201712291158262922.
        Swift4.0入门视频教程,课程内容包含Swift入门知识、数据类型(元组、Dictionary、运算符)、流程控制、函数、类与对象、扩展协议、常见概念、实用进阶、案例实战。 1、119节大容量课程:包含了Swift4.0语言大部分知识点; 2、创新的教学模式:手把手教您iOS开发技术入门,一看就懂,一学就会; 3、完美贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标; 4、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间; 5、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;
    课程收益
        掌握Swift 4.0语言,并通过一整套实例教程,使学员掌握从生成证书、创建app、架构、开发、打包上传、提交审核等整个开发流程!
    讲师介绍
        李发展更多讲师课程
        10年以上IT行业工作经验、三年以上IT行业教学经验。丰富的项目经验和授课经验,授课形式不拘一格。熟悉JAVA,iOS,Swift,平面设计、网页设计、Javascript开发等技术。代表作品:拥有百万下载量、千份五星好评的iOS应用《互动教程 for Photoshop》、《互动教程 for Xcode》、《互动教程 for Illustrator》、《互动教程 for Pages》等。
    课程大纲
      第1章:入门知识
        1.iOS项目模板的介绍  6:37
        2.使用Playground学习Swift  2:55
        3.Swift语言中的常量和变量  1:53
        4.Swift的标识符和关键字  1:57
        5.Swift的表达式Expressions  1:29
        6.给Swift代码添加注释语句  2:12
        7.Swift的几个打印输出语句  1:42
        8.在控制台输出类的实例及其属性  1:42
      第2章:数据类型
        1.Swift的(Boolean)布尔类型  2:40
        2.Swift的(Int)整形类型  4:45
        3.Swift的(Float)和(Double)浮点类型  4:47
        4.字符串(String)及对字符(Characters)的遍历  2:26
        5.Swift字符串的使用详解  5:39
        6.Swift中的元组(Tuples)  2:04
        7.基本数据类型之间的互相转换  2:52
        8.一维数组(Array)的使用详解  2:57
        9.多维数组的创建和遍历  1:49
        10.数组的几种遍历方式  2:09
        11.字典(Dictionary)的使用详解  5:12
        12.Swift的一元、二元和三元运算符  2:52
        13.Swift的位运算符和防溢出运算符  2:26
        14.比较运算符和区间运算符  3:10
      第3章:流程控制
        1.使用for-in循环遍历数组  3:36
        2.使用循环语句获得序列中的最小值  2:56
        3.switch-case语句的实例解析  2:27
        4.continue、break和fallthrough的区别  3:16
        5.while和repeat-where循环语句  2:35
        6.if和if-let判断语句的使用解析  3:17
      第4章:函数
        1.函数func以及函数的参数和返回值  3:22
        2.函数的外部参数名  2:24
        3.创建拥有任意数量参数的函数  2:05
        4.函数的输入输出inout参数解析  1:54
        5.给函数的参数设置默认的取值  1:52
        6.使用函数作为另一个函数的参数  3:00
        7.函数类型的解析  2:10
        8.使用函数类型作为函数的返回类型  2:10
        9.函数可以拥有多个返回值  2:04
        10.藏在函数内部的函数  1:47
        11.递归函数的使用解析  1:58
        12.Swift那些非常实用的内部函数  4:58
      第5章:类与对象
        1.Swift的枚举(enum)类型及遍历  2:46
        2.给枚举类型添加方法  2:11
        3.Swift的结构(struct)类型及其下标(subscript)  3:11
        4.类(class)的初始化方法、属性和方法  2:46
        5.类的引用(reference)特征  2:07
        6.类和结构两个类型的比较  2:48
        7.类属性的set和get方法解析  1:53
        8.类属性的willSet和didSet方法解析  2:21
        9.类析构方法(deinit)的使用  1:29
        10.给类添加下标(subscript)  2:04
        11.类的静态方法(class func)  1:51
        12.将一个类的实例作为另一个类的属性  2:03
        13.类的继承以及方法的重写(override)  2:18
        14.父类在实例类型转化时的应用  2:02
        15.使用is语句检查实例的类型  3:44
        16.使用Any表示任意值类型  2:25
      第6章:扩展协议
        1.使用扩展(extension)扩展类型的属性  1:57
        2.使用extension对方法进行扩展  1:37
        3.使用协议(protocol)进行方法的声明  4:28
        4.问号?和感叹号!的用法解析  5:27
        5.Swift中的闭包(Closure)详解  4:29
        6.Swift语言中的泛型编程  3:18
        7.Swift的do-try-catch错误处理模式  4:48
        8.实例的引用特征和Swift的内存管理  2:19
        9.实例的交叉引用和弱引用(weak)  3:00
        10.Swift的懒加载(lazy initialization)使用解析  2:28
      第7章:常见概念
        1.范围Range、ClosedRange和NSRange的使用  2:43
        2.点CGPoint和变形CGAffineTransform的使用  2:34
        3.尺寸CGSize的使用详解  2:35
        4.范围CGRect的使用详解  3:00
        5.使用NSString对字符串进行各种操作  3:28
        6.日期Date和DateFormatter日期的格式化  4:59
        7.日历Calendar和日期组件DateComponents  1:47
        8.日历Calendar和时区TimeZone  1:54
        9.使用定时组件Timer执行定时任务  4:01
        10.使用UserDefaults和归档方式存取用户数据  6:16
        11.路径URL的使用详解  2:24
        12.使用DispatchGroup管理线程组  1:48
        13.使用UIScreen查询设备屏幕信息  2:09
        14.使用UIColor设置界面组件的颜色属性  3:11
      第8章:实用进阶
        1.Swift语言中的两种单例模式  3:05
        2.Swift语言中的三种消息传递模式  7:05
        3.闭包在定时任务、动画和线程中的使用  3:59
        4.通过protocol在两个对象中进行消息传递  8:25
        5.通过间接代理进行对象间的消息传递  6:04
        6.通过属性进行对象间的消息传递  6:25
        7.使用通知的方法进行对象间的数据传递  6:14
        8.使用performSegue在故事板页面之间进行数据传递  11:11
        9.Swift中的栈Stack和队列Queue详解  5:22
        10.Swift中的链表LinkedList详解  2:58
        11.使用Swift创建一个二叉树BinaryTreeNode  3:51
        12.冒泡排序算法的Swift实现  9:41
        13.选择排序算法的Swift实现  7:58
        14.快速排序算法的Swift实现  10:34
        15.插入排序算法的Swift实现  6:25
        16.希尔排序算法的Swift实现  6:55
        17.归并排序算法的Swift实现  8:57
        18.基数排序算法的Swift实现  8:29
        19.堆排序算法的Swift实现  9:00
      第9章:完整实例
        1.在iTunesConnect中创建产品ACTHelper  10:37
        2.在Xcode9中创建新项目ACTHelper  4:49
        3.创建开发证书和发布证书及其它文件  14:23
        4.在ACTHelper项目中使用CocoaPod管理插件  4:00
        5.创建BaseViewController作为控制器的基类  9:10
        6.创建App的欢迎页面  8:59
        7.登陆页面:创建自定义视图及相关组件  19:43
        8.登陆页面:创建自定义表单Row以及基控制器  16:27
        9.创建用户登陆页面  23:34
        10.用户注册账号信息的输入和短信验证码  31:31
        11.用户注册头像和科目信息输入页面  20:27
        12.用户注册考试成绩输入页面及相关自定义组件  24:49
        13.试题解析页面及相关自定义组件  18:28
        14.试题科目列表及答案列表等自定义组件  27:49
        15.创建试题解析列表页面和试卷选择页面  38:26
        16.创建试题详情页面和浮动菜单组件  35:53
        17.试题原文显示页面和数学公式的渲染  14:32
        18.账号设置列表页面和分享、反馈、评分功能  13:05
        19.会员个人信息设置页面和登出功能  14:03
        20.App发布前的设置以及打包、上传和提交审核  11:46
    大家可以点击【查看详情】查看我的课程
    展开全文
  • 仿写百思不得姐使用swift4.0 , MVVM架构, 有益于初学者的学习
  • Swift 编码规范

    2018-08-17 09:51:10
    一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监...swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是增添了一些新...

    一、swift简史

    1、简介
    swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入swift语言的研发,于2014年发布这一语言的第一版本。swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是增添了一些新特性。这些新特性需要在Xcode9上运行才能显示出效果。值得一提的是它支持unicode9,也就是说,可以用某些图片图标来充当变量。
    2、特点
    • swift取消了预编译指令,宏也被包括在内。某些开发者为了让Objective-C和swift代码兼容,会尽少在Objective-C中定义宏。
    • 取消了Objective-C中的指针等其他不安全访问的使用
    • 使用点语法来调用属性或者函数
    • 去除了NS前缀
    3、为什么要学习swift
    • swift作为面向协议语言,不仅能写移动端,也可以做到搭建服务器端。
    • 纵观国内外iOS开发界,已经有许多公司直接或间接采用swift开发,使用swift语言开发已成为未来iOS开发的趋势。
    • swift以简洁、优雅等优点迅速俘获广大开发者的青睐。
    4、swift与objective-C的重大区别
    • 在swift中是没有.h和.m文件之分的。所有的代码全部都存储在一个文件里面。
    • 在swift中所有的代码都被封装在{}里面
    • OC使用alloc init进行初始化,而swift使用()
    • OC中使用[]来调用方法,而swift中采用点语法。比如UIColor.red
    • swift中不需要用分号分割语句

     

     

             

    展开全文
  • Swift、Xcode和Cocoa入门指南(iOS9 Programming Fundamentals With swift)  第二章 函数  Swift语法中最具特色也最重要的就是声明和调用函数的方式;  所有代码都位于函数中,而动作则是由函数触发的;  ...

    Swift入门指南(iOS9 Programming Fundamentals With swift 

    第二章 函数

             Swift语法中最具特色也最重要的就是声明和调用函数的方式;

             所有代码都位于函数中,而动作则是由函数触发的;

     

            

    print(sum(x: 4, 5))

    func sum(x:Int , _ y:Int) -> Int {
        let z = x + y
        return z
    }

            

             2.1 函数参数与返回值

             

             基于这个函数,我们分块介绍:

             1.声明从关键字func开始,后跟函数的名字;

             调用函数时必须使用函数名,所谓的调用就是运行函数所包含的代码;

             2.每个参数都有严格的格式:参数名,一个冒号,然后是参数类型;

             3.y之前的下划线和空格,对应的是隐藏对外参数名(之后介绍);

             4.箭头运算符->,后跟函数所返回的值类型;

             5.使用关键字return,后跟返回值;

             关键字return实际上做了两件事:它返回后面的值,同时又终止了函数的执行;

             

             2.1.1 Void返回类型与参数

             

             1.无返回类型参数:

             有三种声明方式:可以返回Void,可以返回(),还可以完全省略箭头运算符与返回类型;

             

             如果函数没有返回值,那么函数体就无须包含return语句;如果包含了return语句,那么目的就纯粹是在该处终止函数的执行;

             Void(无返回值的函数的返回类型)

             ()是一个字面值(后面会介绍字面值()的含义)

             函数声明return()是合法的;无论是否声明,()就是函数所返回的,写成return()或return;(后面加一个分号)有助于消除歧义,否则Swift可能会认为函数会返回下一行的内容;

             

             可以将函数返回值捕获并赋给Void类型的变量;

             

             2.无参数的函数:

             函数声明中的参数列表可以完全为空;

             省略参数列表圆括号本身是不可以的,圆括号需要出现在函数声明中,位于函数名之后;

             

             就像不能省略函数声明中的圆括号(参数列表)一样,你也不能省略函数调用中的圆括号;

     

            

    testfunc()

           

    func testfunc() -> () {
        return()
    }

            

             2.1.2 函数签名

             

             可以通过输入输出的类型来描述一个函数,如 (Int,Int)-> Int ,这是一个合法的表达式,他就是函数签名;

             该签名描述了接收这些类型,具有这些数量的参数,并返回该类型结果的函数;

             函数的签名是其类型——函数的类型;

             函数的签名必须包含参数列表与返回类型,两者为空时,可有四种等价方式,包括Void -> Void 与 () -> ();

             

             2.2 外部参数名

             

             函数可以外化其参数名;

             外部名称要作为实参的标签出现在对函数的调用中;

             原因如下:

             1.阐明了每个实参的作用:每个实参名都能表示出自己对函数动作的作用;

             2.将函数区分开来:两个名字可能有相同的名字和标签,但却拥有不同的外化参数名;

             3.有助于Swift与OC和Cocoa通信,后者的方法参数几乎总是有外化名字的;

             

             外化参数名:将外部名字放在内部参数名之前,中间用逗号隔开;

             

             标准规则:默认下,除第一个参数外,所有参数名都会自动外化(实际上是所有的参数均自动外化);

             原因有二:

             1.第一个参数通常不需要外部名,因为函数名通常能够清晰的表明第一个参数的含义;

             2.这个约定使得Swift函数能够与OC方法交互,而后者采取的就是这种方式;

             

             Swift的String和OC的NSString能够自动桥接彼此;

             

             如果函数是自己定义的(即是你声明的),并且OC永远不会调用它,这样就没必要遵循OC的要求了;

             

             外化参数名,将外部名放到内部名之前即可,可相同;

             若不想对参数进行外化,可在内部名之前加一个下划线和一个空格;

     

            sum(x: 3, 4)
            sum(3, y: 4)
            sum(xx: 3, yy: 4)

            

    func sum(_ x:Int , y:Int) -> Int {
        let z = x + y
        return z
    }
    
    func sum(xx x:Int , yy y:Int) -> Int {
        let z = x + y
        return z
    }

            

             什么是函数的名字:

             从技术上来说,一个Swift函数的名字是由圆括号之前的名字加上参数的外部名共同构成的;如果阻止了参数的外部名,那么可以使用一个下划线来表示其外部名;

             

             2.3 重载

             

             在Swift中,函数重载是合法的:具有相同函数名(包括外部参数名)的两个函数可以共存,只要签名不同即可;

             重载也适用于返回类型:具有相同名字与相同参数类型的两个函数可以有不同的返回类型;不过调用上下文一定不能有歧义;也就是说,一定要清楚调用者需要什么样的返回类型;

             

             OC是不允许重载的:如果OC中声明了相同的方法的两个重载版本,那么编译器就会报“Duplicate declaration”错误;

             实际上,如果在Swift中声明了两个重载方法,但是OC却能看到它们,那么就会遇到一个Swift编译错误,因为这种重载与OC是不兼容的;

             

             具有相同标签和不同外部参数名的两个函数并不构成重载;由于函数有着不同的外部参数名,因此他们是名字不同的两个不同函数;

             

             2.4 默认参数值

             

             参数可以有一个默认值:调用者完全可以省略参数,不为其提供实参,对应参数的值就是默认值;

             要提供默认值,在声明中的参数类型后追加一个=号和默认值;

             

             请保证调用时实参的顺序与声明时形参的顺序一致;

     

            saySome("woof")
            saySome("woof", times: 2)

            

    func saySome(_ word:String , times:Int = 3) -> Void {
        print("say \(word) \(times)times")
    }

            

             2.5 可变参数

             

             参数可以是可变参数:调用者可以根据需要提供多个参数类型的值,中间用逗号隔开;函数体会将这些值当做数组;

     

            

    sayStrings(strings: "a","b","c","d", times: 3)

            

    func sayStrings(strings:String... , times:Int = 1) -> Void {
        for _ in 1...times {
            for str in strings {
                print(str + " print", separator: ",", terminator: ",")
            }
            print("\n")
        }
    }

             一个函数最多只能声明一个可变参数(否则就无法确定值列表结束的位置)

             全局print函数的第一个参数就是一个可变参数;

             

             遗憾的是,Swift语言有一个陷阱:没法将数组转换为逗号分隔的参数列表(相比于Ruby中的splat)。如果一开始就有一个某种类型的数组,那么你不能在需要该类型可变参数的地方使用它;

             

             2.6 可忽略参数

             

             局部名为下划线的参数会被忽略,由于没有内部名,也无法在函数体中被引用,仅作为对自己的提示“我知道这里有个参数,只不过故意不用”

             

             2.7 可修改参数

             

             如果希望函数能够修改传递给他的实参的初始值,需要作出三种改变:

             1.要修改的参数必须声明为inout;

             2.在调用时,持有待修改值的变量必须要声明为var,而不是let;

             3.相比于将变量作为实参进行传递,我们传递的是地址,这是通过在名字前面加上&符号做到的;

             

            var s = "hello"
            let result = removeFromString(s: &s, charater: Character("l"))
            print(result,s)

     
    func removeFromString( s:inout String , charater c:Character) -> Int {
        var  howMany = 0
        while let ix = s.characters.index(of: c) {
            s.removeSubrange(ix...ix)
            howMany += 1
        }
        return howMany;
    }


             当调用具有inout参数的函数时,地址作为实参传递给参数的变量总是会被设定;

             

             在使用Cocoa时,会遇到该模式的变种:

             Cocoa的API是使用C与OC编写的,因此看不到Swift术语inout;你可能会看到一些奇怪的类型,如UnsafeMutablePointer;不过从调用者的视角来看,它们是一回事;依然是准备var变量并传递其地址;

             这种可以应用在多返回值的情况,函数本身不返回值,而是将对应实参的地址传过来,通过地址修改它们,这样他们就是操作的结果了;

             

             有时当参数是某个类的实例时,函数需要修改这个没有声明为inout的参数;

             这是类的一个特殊特性,其他两种对象类型(枚举和结构体)风格不同;String不是类,是结构体;

             

             对于类的实例:

     

           

     let d = Dog()
            d.name = "Fido"
            changeNameOfDog(d: d, to: "Rover")

    class Dog {
        var name = ""
    }
    
    func changeNameOfDog(d:Dog , to toString:String){
        d.name = toString
    }

            

             并没有将Dog实例d最为inout参数传递;d一开始使用let而非var进行声明;但我们依然可以修改它的属性

             这是因为:

             类实例的一个特性,即实例本身是可变的;

             

             从技术上说,类是引用类型,而其他对象类型风格则是值类型;

             在将结构体的实例作为参数传递给函数时,实际上使用的是该结构体实例的一个独立的副本(所以要用inout修饰,改为传地址);

             不过,在将类实例作为参数传递给函数时,传递的则是实例本身;

             

             2.8 函数中的函数

             

             可以在任何地方声明函数,包括在函数体中声明;

             声明在函数体中的函数(也叫局部函数)可以被相同的作用域的后续代码调用,不过在作用域之外则完全不可见;

             

             

             对于那些旨在辅助其他函数的函数,这是个又优雅的架构;如果只有函数A需要调用函数B,那么函数B就可以放在函数A中;

             

             有时,即便函数只会在一个地方调用,使用局部函数也是值得的;结构清晰;

             局部函数说明做什么,外部作用域去做;

             

             局部函数就是带有函数值的局部变量;因此,局部函数不能与相同作用域中的局部变量同名,相同作用域中的两个局部函数也不能同名;

             

             2.9 递归

             

             函数调用自身

     

            

    countDownFrom(ix: 5)

    func countDownFrom(ix:Int){
        print(ix)
        if ix > 0 {
            countDownFrom(ix: ix - 1)
        }
    }

            

            2.10 将函数作为值

             

             在Swift中,函数时一等公民,这意味着函数可以用在任何可以使用值的地方;

             函数可以赋给变量;函数可以作为函数调用的参数;函数可以作为函数的结果返回;

             

             函数是有类型的,函数的签名就是其类型;

             

             将函数调用封装到函数中(作为参数传递给其他函数,然后调用),这样做是很有价值的,因为其他函数可以以特殊的方式来调用参数函数;比如完成或之后调用;

             

             举例:Cocoa中的绘图

     

            

    let size = CGSize.init(width: 45, height: 20)
            UIGraphicsBeginImageContextWithOptions(size, false, 0)
            let p = UIBezierPath.init(roundedRect: CGRect.init(x: 0, y: 0, width: 45, height: 20), cornerRadius: 8)
            p.stroke()
            _ = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            

             这样做十分丑陋;

             所有的代码的唯一目的就是获取result,即图像;

             

             每次绘制时唯一不同的就是步骤2,只需编写一个副主函数表示出样板化过程就能解决问题;

     

            func drawing(){
                let p = UIBezierPath.init(roundedRect: CGRect.init(x: 0, y: 0, width: 45, height: 20), cornerRadius: 8)
                p.stroke()
            }
            
            _ = imageOfSize(size: CGSize.init(width: 45, height: 20), whatToDraw: drawing)

    func imageOfSize(size:CGSize , whatToDraw:()->()) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        whatToDraw()
        let result = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return result
    }


            

             这是将绘制指令转换为图像的一种漂亮的方式

             

             OC中的block块语法,在Swift中就是个函数,将其当做函数并传递就可以了;

             

             为了让函数类型说明符更加清晰,请通过Swift的typealias特性创建一个类型别名,为函数类型赋予一个名字;这个名字可以是描述性的,请不要与箭头运算符符号搞混;

             如果定义typealias VoidVoidFunction = ()-> (),那就可以通过改签名指定函数类型是使用VoidVoidFunction;

             

             2.11 匿名函数

             

             匿名函数:不需要函数名,传递时只传递函数的函数体即可;

             

             构造匿名函数,你需要完成两件事:

             1.创建函数体本身,包括外面的花括号,但不需要函数声明;

             2.如果必要,将函数的参数列表和返回值类型作为花括号的第一行,后跟关键字in;

             

             Swift提供了一些便捷写法:

             1.省略返回类型:

             如果编译器知道匿名函数的返回类型,那么你就可以省略箭头运算符及返回类型说明;

             2.如果没有参数,那么可以省略in这一行:

             如果匿名函数不接收参数,并且返回类型可以省略,那么in这一行就可以被完全省略;

             3.省略参数类型:

             如果匿名函数接受参数,并且编译器知道其类型,那么类型就可以省略;

             4.省略圆括号:

             如果省略参数类型,那么包围参数列表的圆括号也可以省略;

             5.有参数时也可以省略in这一行:

             如果返回类型可以省略,并且编译器知道参数类型,那就可以省略in这一行,直接在匿名函数体中引用参数,方式是使用魔法名$0、$1等,并且要按顺序引用;

             6.省略参数名:

             如果匿名函数体不需要引用某个参数,那就可以在in这一行通过下划线来代替参数列表中该参数的名字;事实上,如果匿名函数体不需要引用任何参数,那就可以通过一个下划线来代替整个参数列表;

             

             不过注意:如果匿名函数接收参数,那就必须要以某种方式承认他们的存在,可以省略in这一行,然后通过魔法名$0等来使用参数,或是保留in这一行,然后通过下划线省略参数,但不能在省略in这一行的同时又不通过魔法名来使用参数,否则,代码编译不过;

             

             7.省略函数实参标签:

             如果匿名函数是函数调用的最后一个参数,那么你可以在最后一个参数前通过右圆括号关闭函数调用,然后放置匿名函数体且不带任何标签(这叫尾函数)

             8.省略调用函数圆括号:

             如果使用尾函数语法,并且调用的函数只接收传递它的参数,那就可以在调用中省略空的圆括号;这是唯一一个可以从函数调用中省略圆括号的情形;

             9.省略return关键字:

             如果匿名函数体中只包含一条语句,并且该语句使用关键字return返回一个值,那么关键字return就可以省略;

             

             示例:

             数组map方法接收一个函数,该函数接收一个参数,并且返回一个与数组元素相同类型的值;

     

            let arr1 = [2,4,6,8]
            let arr2 = arr1.map{$0*2}
            print(arr2)

            

             示例中,返回类型已知,参数类型已知,只有一个参数,省略in一行,使用魔法名$0引用参数,只有一条语句,作为return语句,map不接收其他参数,因此省略圆括号,在名字后直接跟着尾函数即可;

             

             2.12 定义与调用

             

             Swift中非常常见的一种模式模式就是定义一个匿名函数然后调用它

     

            let funcPara = {
                (a:Int , b:Int) in
                return a + b
            }(3,4)
            
            print(funcPara)

            

            

             注意花括号后面的圆括号;花括号定义一个匿名函数体,圆括号则调用了这个匿名函数

             

             动作在必要的时候发生(函数在必要的时候调用),而不必依赖于一系列准备步骤(一系列配置),把这些步骤放到匿名函数体中,然后调用返回实例,作为动作的参数即可;


            

            self.view.addSubview({
                (rect:CGRect) -> UIView in
               let view = UIView.init(frame: rect)
                view.backgroundColor = UIColor.red
                return view
                }(CGRect.init(x: 0, y: 0, width: 20, height: 30))
            )

            

             2.13 闭包

             

             Swift函数就是闭包:这意味着他们可以在函数体作用域中捕获对外部变量的引用;

             

             函数在传递时会持有其所在的环境,甚至在传递到另一个全新环境中再调用时也如此;

             对于“捕获”,是当函数作为参数传递时,他会持有对外部变量的内部引用,这使得函数成为一个闭包;

             被捕获的引用由函数维护,当函数被调用时,可以使用该引用指向的对象;

             

             2.13.1 闭包是如何改善代码的

     

    self.view.addSubview({
               let imgView = UIImageView.init(frame: CGRect.init(x: 100, y: 100, width: 50, height: 60))
                imgView.image = makeRoundedRectangle(sz: CGSize.init(width: imgView.frame.size.width, height: imgView.frame.size.height))
                return imgView
            }())

    func makeRoundedRectangle(sz:CGSize) -> UIImage? {
        let image = imageOfSize(size: sz){
            let p = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: sz), cornerRadius: 8)
            p.stroke()
        }
        return image
    }


             func imageOfSize(size:CGSize , whatToDraw:()->()) -> UIImage? ;函数调用时,尾函数语法传递的是一个匿名闭包,该闭包捕获了外部函数 func makeRoundedRectangle(sz:CGSize) -> UIImage? ;的sz参数的引用,这样做代码更加通用,也变得更紧凑了;

             

             2.13.2 返回函数的函数

             依照前面的例子;

             相对于返回一张图片,函数可以返回一个函数,这个函数可以创建指定大小的圆角矩形

     

            let maker = makeRoundedRectangleMaker(sz: CGSize.init(width: 100, height: 200))
            self.view.addSubview({
                let imgView = UIImageView.init(frame: CGRect.init(x: 100, y: 100, width: 100, height: 100))
                imgView.image = maker()
                return imgView
                }())

    func makeRoundedRectangleMaker(sz:CGSize) -> () -> UIImage? {
        return {
            return imageOfSize(size: sz){
                let p = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: sz), cornerRadius: 8)
                p.stroke()
            }
        }
    }


            

             注意函数makeRoundedRectangleMaker的声明:请记住每个箭头运算符后面的内容就是返回值的类型;

             

             makeRoundedRectangleMaker类似于一个工厂,用于创建类似于maker的一系列函数,其中每个函数都会生成特定尺寸的一张图片,这是对闭包功能的最好说明:捕获了特定尺寸,调用即可生成图片;

             

             2.13.3 使用闭包设置捕获变量

             

             闭包可以捕获其环境的能力甚至要超过之前所介绍的,如果闭包捕获了对外部变量的引用,并且该变量的值是可以修改的,那么闭包就可以设置该变量;

             

             2.13.4 使用闭包保存捕获的环境

             

             当闭包捕获其环境后,即便什么都不做,他也可以保存该环境;

             举一个比较经典的例子:一个可以修改函数的函数;

     

            let countedGreet = countAdder {
                print("hello dm")
            }
            countedGreet()
            countedGreet()
            countedGreet()

    func countAdder(f:@escaping () -> ()) -> () -> () {
        var ct = 0
        return {
            ct = ct + 1
            print("count is \(ct)")
            f()
        }
    }

            

             关于@escape标注的使用:一个被保存在某个地方等待稍后(比如函数返回以后)再调用的闭包就叫做逃逸闭包(传递给map的闭包会在map中同步执行,是非逃逸的)

             

             countAdder向传递给它的函数增加了调用次数的功能;

             ct故意声明在了所返回的匿名参数外,这样做,ct只会被初始化为0一次,然后会由匿名函数所捕获,这样,该变量就会被保存为counterGreet环境的一部分;

             

             同时这个示例(可以保存环境状态)还有助于说明函数是引用类型;

             赋值或是参数传递就会生成对相同函数的新引用;

             

             2.14 柯里化函数

             

             在之前的示例中,生成图片的cornerRadius是硬编码,我们希望能够制定圆角半径,可以使用下面的方式:

             现在makeRoundedRectangleMaker所返回的函数不接受参数,我们可以让它接收一个参数;

     

            

            self.view.addSubview({
                let imgView = UIImageView.init(frame: CGRect.init(x: 200, y: 100, width: 80, height: 80))
                imgView.image = makeRoundedRectangleMakerKLH(sz: CGSize.init(width: 80, height: 80))(10)
                return imgView
                }())

    func makeRoundedRectangleMakerKLH(sz:CGSize) -> (CGFloat) -> UIImage? {
        return {
            cornerRadius in
            return imageOfSize(size: sz){
                let p = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: sz), cornerRadius: cornerRadius)
                p.stroke()
            }
        }
    }


            

             函数返回的函数接收一个参数就叫做柯里化函数;

     

    展开全文
  • 为什么80%的码农都做不了架构师?>>> ...
  • swift4.0 Any 和 AnyObject

    2017-09-26 15:13:30
    Any 和 AnyObject 是 Swift 中两个妥协的产物,也是很让人迷惑的概念。在 Swift 官方编程指南中指出 AnyObject 可以代表任何 class 类型的实例 Any 可以表示任意类型,甚至包括方法 (func) 类型 先来说说 ...
  • 原文链接:http://www.swift51.com/swift4.0/chapter2/01_The_Basics.html 基础部分(The Basics) 本页包含内容: 常量和变量 声明常量和变量 类型标注 常量和变量的命名 输出常量和变量 注释 分号 整数 ...
  • 小视频 001--swift简史小视频 002--Playground体验 003--常量&...拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入swift语言的研发,于2014年发布这一语言的第一版本。...
  • swift4.0语法杂记

    2019-01-03 17:20:24
    001--swift简史小视频 002--Playground体验 003--常量&amp;变量 一、swift简史 1、介绍   swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在...
  • 摘要: SendBird是国外一款针对移动App和网站的Chat API,其开发团队成员Jed Gyeong分享了他们在将产品从Objective-C向Swift转换过程中所学习到的一些心得体会。 SendBird为常见系统均提供了示例UI,方便开发者构建...
  • 1.3 Swift语言演进

    2020-06-15 13:34:27
    1.3 Swift语言演进 小荷才露尖尖角,早有蜻蜓立上头...2010年7月,苹果开发部门高级总监、架构师克里斯·拉特纳 (Chris Lattner) 开始着手 Swift 编程语言的设计工作,在用一年时间完成基本架构后,他领导了一个设计团
  • 目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类型进行判断,还要进行强转...
  • 版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明:  1. 将Swift从Objective-C混合的md文件中抽出(正在进行…) 使用方法:根据目录关键字...
  • 1.1. Swift架构概述 官方给出的标准架构进行分析,如图,分别为存储节点(Storage node)、代理节点(Proxy node)和认证节点(Auth node)三部分。 1.1.1. 代理节点 代理节点可以说是Swift的核心,运行着swift...
  • Swift 4.0 学习笔记
  • 序言 仁圣之本,在乎制度而已, 管理之本,在乎规则而已。 在软件开发过程中,通常一个软件项目要靠多人合作完成的。而在此过程中的修修改改一定...拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹...
  • “我们如何在每天的开发过程中使用面向协议编程?Natasha 回答了这个问题,并专门针对...关注本篇在 App Builders CH 大会上的演讲,你将从面向对象编程转向面向协议编程,这样能使你的 Swift 编程更加清晰、更加易读!
1 2 3 4 5 ... 20
收藏数 1,229
精华内容 491
关键字:

4.0架构 swift