swift4.0 初始化变量

2018-01-19 11:08:14 si1279571489 阅读数 454

经过第一天的学习,对Swift语法已基本会用,今天就就来初始化一下项目,在项目中进行实战学习。(发布的这些博客 完全按照自己的学习思路进行发布)

新建项目及模块文件夹的过程和oc一致,只要记得语言选择Swift。在AppDelegate中初始化跟控制器,

window = UIWindow(frame:UIScreen.main.bounds)
window?.backgroundColor = UIColor.white
window?.rootViewController = UIViewController()
window?.makeKeyAndVisible()


接下来 我要做列表视图 tableView
定义全局变量

var tableView = UITableView()
var dataArray:NSMutableArray = []

初始化tableView并遵循代理,遵循代理直接在父类的后面用逗号隔开

tableView = UITableView.init(frame: self.view.frame, style:UITableViewStyle.plain)
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)

实现代理方法

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return dataArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView .dequeueReusableCell(withIdentifier: "CellID")
    if cell == nil
    {
        cell = UITableViewCell.init(style: UITableViewCellStyle.subtitle, reuseIdentifier: "CellID")
    }
    cell?.textLabel?.text = (dataArray[indexPath.row] as! String)
      return cell! 
 }

加载数据刷新列表

dataArray = ["s","c","h"]
tableView.reloadData()
2017-12-29 13:17:53 fzhlee 阅读数 558
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
大家可以点击【查看详情】查看我的课程
2017-12-28 15:19:01 jackyan0927 阅读数 389

翻译能力有限,如有不对的地方,还请见谅!希望对Swift的学习者有所帮助,使用的编写工具:JQNote    InNote(iPhone)


属性是把值和某个类,结构体或者枚举联系在一起。存储型属性存储一个实例的常量和变量值部分,然而计算型属性会计算出(而不是存储)一个值。类,结构体和枚举都支持计算型属性,而存储型属性只有类和结构体支持。这两种属性通常跟某个类型的实例关联。然而,属性也可以跟类型本身关联起来,这种属性称之为类型属性。另外,你可以定义一个属性观察者来检测该属性值的改变。


存储属性

一个存储属性是一个常量或者变量,被存储作为一个类或者结构体实例的一部分。你可以在定义它的时候给它一个缺省值,也可以在初始化方法中设置和修改存储属性的初始化值,即便是该存储属性是常量。如果你创建了一个常量结构体实例,那么就不能修改该实例的属性,即使属性被声明为变量。


let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)

// this range represents integer values 0, 1, 2, and 3

rangeOfFourItems.firstValue = 6

// this will report an error, even though firstValue is a variable property”


因为结构体是值类型,当一个结构体实例被声明为常量,那么它的所有属性都不能被改变。但是对于类来说,是引用类型,如果类实例被声明为常量,你还可以改变它的变量属性的。


懒存储属性

这种属性直到它第一次被使用才会初始化。在声明存储属性前面加上lazy关键字就表示为懒存储属性。


你必须总是声明懒存储属性为变量(var),因为直到实例初始化完成之后,它的初始化值可能不能被获取,而常量属性必须总是在实例初始化完成之前有一个值。


class DataImporter {

    /*DataImporter is a class to import data from an external ”

“file.

     The class is assumed to take a non-trivial amount of time to initialize.

     */


    var filename = "data.txt"

    // the DataImporter class would provide data importing functionality here

}

 

class DataManager {

    lazy var importer = DataImporter()

    var data = [String]()

    // the DataManager class would provide data management functionality here

}

 

let manager = DataManager()

manager.data.append("Some data")

manager.data.append("Some more data")”


如上面的例子,因为importer 被声明为一个lazy 属性,DataImporter实例仅仅是当 importer属性第一次被调用获取的时候,才会创建。

print(manager.importer.filename)

// the DataImporter instance for the importer property has now been created

// Prints "data.txt”


计算型属性

计算型属性实际上不会存储一个值,相反,它们提供了一个getter和一个可选的setter方法来直接获取或者设置其它属性的值。

struct Point {

    var x = 0.0, y = 0.0

}


struct Size {

    var width = 0.0, height = 0.0

}


struct Rect {

    var origin = Point()

    var size = Size()

    var center: Point {

        get {

            let centerX = origin.x + (size.width / 2)

            let centerY = origin.y + (size.height / 2)

            return Point(x: centerX, y: centerY)

        }

        set(newCenter) {

            origin.x = newCenter.x - (size.width / 2)

            origin.y = newCenter.y - (size.height / 2)

        }

    }

}


var square = Rect(origin: Point(x: 0.0, y: 0.0),

                  size: Size(width: 10.0, height: 10.0))

let initialSquareCenter = square.center

square.center = Point(x: 15.0, y: 15.0)


只读的计算型属性

一个计算型的属性,如果只有getter方法,没有setter方法,那就被认为是一个只读的计算属性。你可以声明一个简单的只读计算属性,不需要get关键字:

struct Cuboid {

    var width = 0.0, height = 0.0, depth = 0.0

    var volume: Double {

        return width * height * depth

    }

}


let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)

print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")

// Prints "the volume of fourByFiveByTwo is 40.0”


属性观察者

属性观察者观察和响应一个属性值的改变。当属性值每次被set的时候,观察者都会被调用,即使新的值和当前的值相同。除了lazy属性,你可以将属性观察者添加到任何存储属性:


>> willSet :值被存储之前调用

>> didSet :新值被存储之后调用


当你实现了willSet,它会传递一个新的值作为一个常量参数。你也可以给这个参数特定一个名字。如果你没有写这个参数名,那么默认newValue可以被使用。类似,如果实现了didSet,你也可以特定一个参数名或者使用默认的oldValue。

class StepCounter {

    var totalSteps: Int = 0 {

        willSet(newTotalSteps) {

            print("About to set totalSteps to \(newTotalSteps)")

        }

        didSet {

            if totalSteps > oldValue  {

                print("Added \(totalSteps - oldValue) steps")

            }

        }

    }

}


类型属性

实例属性属于某个类型的实例,每次在创建实例的时候,它有自己的一系列属性。与其它实例是分开的。

你也可以定义属于类型自己的属性,而不属于每个该类型的实例。类型属性只会拷贝一次,无论该类型被创建了多少个实例。

不像存储实例属性,存储类型属性必须赋一个缺省值,这是因为类型自己没有一个初始化器可以在初始化的时候给类型属性设置值。

定义一个类型属性,使用staic关键字:

struct SomeStructure {

    static var storedTypeProperty = "Some value."

    static var computedTypeProperty: Int {

        return 1

    }

}

enum SomeEnumeration {

    static var storedTypeProperty = "Some value."

    static var computedTypeProperty: Int {

        return 6

    }

}

class SomeClass {

    static var storedTypeProperty = "Some value."

    static var computedTypeProperty: Int {

        return 27

    }

    class var overrideableComputedTypeProperty: Int {

         return 107

    }

}


获取和设置类型属性:

print(SomeStructure.storedTypeProperty)

// Prints "Some value."

SomeStructure.storedTypeProperty = "Another value."

print(SomeStructure.storedTypeProperty)

// Prints "Another value."

print(SomeEnumeration.computedTypeProperty)

// Prints "6"

print(SomeClass.computedTypeProperty)

// Prints "27”



2017-12-04 13:49:02 jackyan0927 阅读数 328

翻译能力有限,如有不对的地方,还请见谅!希望对Swift的学习者有所帮助微笑,使用的编写工具:JQNote


常量和变量关联一个名称(比如:maximumNumberOfLoginAttempts 和 welcomeMessage)和一个特殊类型的值(比如:数字10和字符串“Hello”)。一个常量一旦被赋值后就不能再改变,一个变量可以再次被赋予不同的值。


声明常量和变量

常量和变量在使用前必须要声明。你可以使用关键字let来声明一个常量,使用关键字var来声明一个变量。下面是一个如何声明变量和常量的例子:


let maximumNumberOfLoginAttempts = 10


var currentLoginAttempt = 0


这段代码表示:“声明了一个新的常量maximumNumberOfLoginAttempts,并且给它赋值10. 然后声明了一个新的变量currentLoginAttempt,并且设置了一个初始化的值0.” 在这个例子中,最大的登录次数被声明为一个常量,因为最大值不会再改变。当前登录的次数被声明为一个变量,是因为这个值在每次尝试登录失败后必须增加。你可以在一行声明多个变量或者常量,用逗号隔开:


var x = 0.0, y = 0.0,z =0.0


【注意】 如果代码中一个存储值不会发生改变,那么总是使用关键字let声明它为常量,如果存储值需要被改变,那么就使用变量。


类型注释

当你声明一个常量或者变量时,为了该常量或者变量可以存储值的类型更清晰明确,你可以这样添加一个类型注释:在变量或者常量名称后添加一个冒号,空格,然后再加上类型名称。下面的例子为一个变量welcomeMessage提供了一个类型注释,表示该变量可以存储String类型的值:


var welcomeMessageString


这段代码表示:“声明了一个String类型的变量welcomeMessage”,这意味着“可以存储任何String类型的值”。可以把它看作是可以存储的“数据的类型”(或者“类似的数据类型”)。现在变量welcomeMessage可以被设置任何字符串值:welcomeMessage=“Hello”。你可以在一行定义多个相同类型的变量,用逗号隔开,只在最后一个变量名称后添加一个单独的类型注释:


var red,green,blue: Double


【注意】 很少需要在实际中编写类型注释,如果你在定义一个常量或者变量的时候给它设置了初始化值,Swift总是会自动推断出该变量或常量的类型。在后续的类型安全和类型推断中会有介绍。在上面的例子中,welcomeMessage没有设置初始化值,因此它的类型就是特别声明的类型注释String,而不是根据初始化值推断的类型。


命名常量和变量

常量和变量的名称可以包含几乎任何字符,包括Unicode字符:


letπ =3.14159

let你好 ="你好世界"

常量和变量名不能包含空格字符、数学符号、箭头、私有(或无效)Unicode代码,或者行-和画的字符。也不能以数字开头,尽管数字可能被包括在名字的其他地方。一旦你声明了一个确定类型的常量或者变量,就不能再次使用相同的名称来声明它,或者存储一个不同类型的值给它。也不能把一个常量变为为变量,或者把一个变量变为常量。


【注意】 如果你使用了与Swift关键字一样的名称来命名一个常量或者变量,用引号(`)把该关键字括起来。然而,尽量避免这样使用,除非你别无选择。


打印常量和变量

你可以打印一个常量或者变量的值,通过print(_:separator:terminator:)方法:


print(friendlyWelcome)   


print(_:separator:terminator:)是一个全局函数,可以打印一个或多个值到合适的输出端。例如,在Xode中,print(_:separator:terminator:)函数打印它的输出到“console”面板中。separator和terminator参数有默认值,因此调用的时候,可以忽略它们。缺省的,该函数通过添加换行符来终止一行的打印,如果没有换行符,传一个空字符串给terminator参数,例如:print(someValue, terminator: “”)。


Swift使用字符串插值来包含一个变量或者常量名称作为一个长字符串中的占位符,提示swift用该常量或者变量的值来替换它。如下:


var friendlyWelcome = "Bonjour!"


print("The current value of friendlyWelcome is \(friendlyWelcome)")




2017-12-25 14:26:42 fzhlee 阅读数 2539

免费下载地址: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