分类 swift 下的文章

CocoaPods相关知识点

软硬件环境

  • OS X EI Capitan
  • Xcode 7.0.1

简介

CocoaPods是iOS中最常用的第三方类库管理工具,类似于ubuntu linux里的apt-get,绝大多数有名的开源类库都支持CocoaPods。CocoaPods是用ruby语言实现的,所以要想使用,首先必须要有ruby环境。

配置CocoaPods

由于某些你也知道的原因,官方的镜像有时候会链接不上,首先我们用国内的taobao镜像来代替官方的。

gem sources --remove https://rubygems.org
gem sources -a https://ruby.taobao.org
gem sources -l

gem sources -l命令是用来查看镜像的。配置完毕以后,执行如下命令

pod setup

安装成功后,CocoaPods环境就安装好了。pod命令很强大,详细的用法可以查看其帮助。

Usage:
    $ pod COMMAND
      CocoaPods, the Cocoa library package manager.
Commands:
    + cache         Manipulate the CocoaPods cache
    + deintegrate   Deintegrate CocoaPods from your project
    + env           Display pod environment
    + init          Generate a Podfile for the current directory
    + install       Install project dependencies according to versions from a
                    Podfile.lock
    + ipc           Inter-process communication
    + lib           Develop pods
    + list          List pods
    + outdated      Show outdated project dependencies
    + plugins       Show available CocoaPods plugins
    + repo          Manage spec-repositories
    + search        Search for pods
    + setup         Setup the CocoaPods environment
    + spec          Manage pod specs
    + trunk         Interact with the CocoaPods API (e.g. publishing new specs)
    + try           Try a Pod!
    + update        Update outdated project dependencies and create new Podfile.lock

Options:

    --silent        Show nothing
    --version       Show the version of the tool
    --verbose       Show more debugging information
    --no-ansi       Show output without ANSI codes
    --help          Show help banner of specified command

APP中如何使用?

创建好Xcode工程WeatherApp后,在工程目录中新建个Podfile文件,以类库AFNetworking为例,添加语句

platform :ios, '9.0'
use_frameworks!

target 'WeatherApp' do
    pod 'AFNetworking'
end

platform指定平台及对应版本号,pod指定第三方类库,后面可以跟版本号,也可以不跟,默认为最新版本。

Podfile编辑完毕后,进行安装

pod install

执行完毕后会在工程目录下生成WeatherApp.xcworkspace文件及pod文件夹,关闭xcode,然后双击WeatherApp.xcworkspace文件再次打开工程,AFNetworking类库就可以在此工程中使用了。

参考文献

1、<https://cocoapods.org>

Swift开发iOS应用(2)定制单元格

软硬件环境

  • OS X EI Capitan
  • Xcode 7.0.1

简介

前面一节我们实现了一个简单的列表,列表中的单元格是一串字符,在实际开发中一般不会如此简单,有可能还包括其它一些控件并且这些控件的位置还会各异,这时我们就需要对单元格进行自定义,本节我们将实现这个功能。

实现步骤

UI部分

新建一个工程,工程名为CustomCellDemo,模板选择Single View Application,上一节中创建的列表是通过在ViewController里选择Table View控件,然后配置代理,设置数据源来实现的,相对来说比较麻烦。本节将用一种全新的方法来实现,那就是TableViewController

首先从控件库中拖拽TableViewController到storyboard,将默认的ViewController前面的箭头移动到TableViewController,设置成初始控制器,然后删除默认的ViewController

接着将源码文件ViewController.swift也删除,删除时选择”Move to Trash”选项,如下图

导入图片

在左侧的文件导航栏里选中Assets.xcassets,然后从Finder里将图片拖动进来,我这里只准备了一张图片,@2x、@3x暂时没有

表格控制器

删除了默认的控制器,就需要再重新创建一个ViewController,如下图操作

关联视图和控制器

打开storyboard,选中ViewController,在右侧的Identity Inspector —> Custom Class —> Class里选择我们刚刚创建的CustomTableViewController

定制单元格

首先在storyboard里设置单元格的Identifier为”Cell”,Style选择”Custom”,

然后添加1个ImageView和2个UILabel控件,并调整他们的大小及位置。

创建单元格类

关联单元格与控制类

编辑CustomViewController.swift

准备2个数组来作为UILabel的数据源,图片就是之前导入进来的

var colors = ["Red","Yellow","Green","Gray","Orange","Black","White"]
var colorsChinese = ["红色","黄色","绿色","灰色","桔色","黑色","白色"]

重写方法tableView(tableView: UITableView,numberOfRowsInSection section: Int) —> Int,让其返回数据的元素个数,其实就是列表的行数

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return colors.count
    }

最后重写方法tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) —> UITableViewCell,这里需要返回我们自定义的单元格类,使用as进行强制转换,给单元格中的UIImageView和UILable赋值,完成单元格的自定义。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomTableViewCell

        // Configure the cell...
        cell.cellEnglish.text = colors[indexPath.row]
        cell.cellChinese.text = colorsChinese[indexPath.row]
        cell.cellImagge.image = UIImage(named: "penguin")

        return cell
    }

完成后,command + R运行下程序,在模拟器中查看效果

源码下载

https://github.com/djstava/SwiftForiOS/tree/master/CustomCellDemo

如何在Swift中调用C函数

软硬件环境

  • Mac OS X 10.9.5
  • Xcode 6 beta 5

Swift调用C函数

  1. 新建工程,这里创建的是OS X的command line工程

  1. 在Product Name里填上工程名,这里写的是SwiftCallC,点击Next,选择本地磁盘目录进行保存。

  1. 给工程建立一个桥接文件,它建立起了swift和c的联系。点击File-->New File,弹出“Choose a template for your new file”对话框,选择OS X下的source,选中Objective-C File,填上文件名(OCFile.m),点击"Next"后会弹出"Would you like to configure an Objective-C bridging header? ",选择Yes,创建SwiftCallC-Bridging-Header.h文件

  2. 给工程建立一个C语言文件。跟上述步骤3类似,只不过这里选择的是C文件,这里的文件取名为CFile.c,同时自动生成CFile.h文件

  3. 开始编写代码。
    在SwiftCallC-Bridging-Header.h文件中声明C函数,这里是void callCDemo()

    在CFile.c中定义这个函数

    在main.swift中调用这个C函数

  4. 编译运行

Swift基本语法快速一览

软硬件环境

  • OS X EI Capitan
  • Xcode 7

前言

Swift是Apple公司在2014年WWDC上发布的新的程序设计语言,可以与Objective-C无缝衔接,共同运行在Mac OS X、iOS和watchOS平台。之所以Apple会推出这样一门新的程序开发语言,是因为Objective-C过于古老,开发门槛相对更高,而Swift则是集当前市面上程序设计语言的诸多优点于一身,更加简单、更加高效,对扩张和巩固Apple的生态圈大有裨益。本文基于swift2.0。

关于Playground

Playground是xcode的一个新功能,它能够在你敲完代码后立即显示代码执行的结果,而不需要去编译然后再打开模拟器去执行,是不是很酷?本文提到的swift语法都是在这个游乐场里进行的。

常量和变量

常量的值一旦设定就不能改变,用关键字let来声明;变量的值可以随意改变,用关键字var来声明。

let MAX = 127 //常量名一般全大写
var str = "hello swift" //声明一个变量并且进行初始化,这里可以看到swift里的语句不需要用;来分隔,加上也是可以的,根据你的编码习惯而定

与其它程序设计语言不同的是,可以用unicode字符来作为常量或变量名

let π = 3.1415926
var 你好 = "世界"
let ?? = "djs"

基本数据类型

整数

和大多数编程语言一样,整形是没有小数部分的数字,也有有符号和无符号之分,在swift中,还提供了2个全局的方法,max和min,分别用来获取对应类型的最大值和最小值

Int8.max
UInt32.min

浮点数

是带有小数部分的数字,也有Float和Double两种精度的表示方式,具体要看程序的需要

var num: Double = 3.14159267

字符和字符串

var ch: Character = "a" //声明一个字符

字符串是有序的字符类型的集合。

var str1: String = "hello"
var str2: String  = "swift"
var str3 = str1 + str2 //字符串的连接
let cha: Character = "!"
str2.append(cha) //在字符串的尾部添加一个字符
print("str2 is \(str2)") //字符串的插值操作

str2.insert("?", atIndex:str2.startIndex) //在str2的开头插入一个字符
//还有很多内置API来操作字符串,如hasPrefix检查是否有前缀,hasSuffix()检查是否有后缀,删除字符串的系列函数removeAtIndex,removeAll等等,需要的时候请自行查阅Apple的文档

布尔型

Bool类型,只能取值true和false,这点跟C语言(非0为真,0为假)有点不同

let isRight: Bool = true

数组

和大多数编程语言一样,数组是相同数据类型的一个组合

var arr: [String] = ["red","green","blue"]

元组

元组是多个值的一个组合,和数组不一样的是,元组的数据类型不要求是一样的。如果想要访问某个元素,可以通过下标去访问

let tuple1 = ("年龄",100)
tuple1.0

可选类型

可选类型会有两种情况,要么有值,要么没有即为nil

var num: Int? //num是一个可选类型的变量,没有初始化的情况下值是nil

如果说,确定可选类型的变量有值,可以在变量后面紧跟个!来取值

num!

swift 2.0中提供了一个新的方法if-let来进行可选绑定

if let constantName = someOptional {
    statements
} else {
    other statements
}

字典

字典是一种存储多个相同类型的值得容器,每个元素都是一个键值对(key:value),这点很像JSON,可以通过属性keys和values来获取所有的key和value

let dict: Dictionary = ["姓名":"高翔","性别":"男"]
dict.keys
dict.values

基本运算符

像+、-、*、/、%、+=、-=、*=、/=、%=、++、——、>、>=、!=等运算符这里就不讲了,与其它语言里的都一样,主要看看swift独特的地方

=== //恒等于,用来判断2个对象是否是引用同一个对象实例
!== //不恒等,同上

a ?? b //??是空合运算符,a必须是可选类型,当a的值不为空时,表达式的值为a!,否则为b,b的类型必须要和a存储的类型一样

1...5 //开区间运算符,包括5
1..<5 //闭区间运算符,不包括5

程序控制流

if语句

if condition {
    statements
}

if语句后面可以跟上else语句来操作不满足if条件的情况,这点和其它语言无二

while循环

var index: Int = 0
while (index < 5) {
    print("index:+ \(index)")
    index++
}

for 和 for-in循环

//传统的for循环
for(index=0;index<=5;index++){
    statements
}
//for-in循环
for index in 1...5 {
    statements
}

repeat-while

repeat-while跟其它语言里的do-while循环是一样的

repeat{
    statements
}while condition

switch-case

switch constant{
    case value1:
        statements
    case value2,value3:
        statements
        fallthrough
    default:
        do sth
}

如果多个case的执行语句一样,case之间用逗号隔开,注意到case语句里没有break语句用来跳出循环,而如果需要在执行玩一个case后,自动执行后面的case,可以使用fallthrough关键字

函数

函数是用来完成特定任务的独立的代码块,swift中是这样定义函数的

func add(a:Int,b:Int) ->Int{
    return a+b
}

let num = add(3, b: 4)

swift的函数声明,比较特殊的是函数返回值的说明,需要注意。本人也更喜欢这种方式,更接近与自然语言。

函数的参数传递有传值与穿引用2中,传值时形参是实参的一份拷贝,它的改变不会影响到实参,而穿引用改变的就是实参,来看个例子

func swap(inout a:Int,inout b:Int){
    let temp:Int = a
    a = b
    b = temp
}

var a:Int = 3
var b:Int = 4

swap(&a, b:&b)

闭包

闭包本质上是一个代码块,与函数的区别就是,这个代码块不需要被多次调用,如果某段代码会被多次用到,就需要用函数来表示。看看swift官方给出的例子

let names = ["Chris","Alex","Ewa","Barry","Daniella"];
names.sort({(s1:String,s2:String)->Bool in return s1 > s2})

闭包的函数体部分由关键字in引入,注意看是不是跟函数非常像。

小结

本文作为Swift From Scratch系列的开篇,简单介绍了下swift语言的一些基本语法。作为iOS的新进开发者,希望这个系列能够记录自己的学习历程,也希望能够帮助到一些人,仅此而已,文中如有错误,敬请指正,推荐下参考文献2的视屏教程。

参考文献

Swift开发iOS应用(1)列表的实现

软硬件环境

  • OS X EI Capitan
  • Xcode 7.0.1

简介

列表,可以说是控件中最重要的一个,在iOS中是UITableView,本节就来学习一下如何来实现一个列表,如下所示效果图

效果图

实现步骤

UI部分

新建一个工程,工程名为UITableViewDemo,模板选择Single View

在Xcode的右下角控件库里选择Table View,按住拖拽到storyboard里,并将其拖大至全屏

将Table View的Prototype Cells设成1,接着选中Prototype Cells,在右上角的属性试图中的Stype选择Basic,设置Identifier为Cell(可以为任意,会在后面的代码文件中使用),如图

给列表绑定数据

经过上面的操作,已经可以看到列表了,只是每个单元格都是空的,没有任何数据

这里提供一个颜色数组,它的每个元素将会被显示到相应的单元格中

var colors = ["Red","Yellow","Green","Gray","Orange","Black","White"]

在ViewController类中需要实现UITableViewDataSource和UITableViewDelegate两个协议,然后需要实现2个方法

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

这里返回给定数组的大小,就是整个列表有多少行

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.text = colors[indexPath.row]
        return cell
    }

上面的”Cell”就是在storyboard里的Identifier,这个函数返回一个cell,cell上显示一串字符。dequeueReusableCellWithIdentifier方法会重复利用单元格,提高效率,节省资源。常见的像微博里的消息列表,设备的每一屏只显示几条消息,下拉刷新一次,单元格还是这几个,只不过内容被重新填充了。

最后一步,切换到storyboard中,打开View Controller Scene,将Table View与View Controller做一个绑定,按住control键,拖动Table View到View Controller上放开,选择dataSource,重复一次,选择delegate

至此,列表的数据才被正确地显示了出来,可以在模拟器上查看

源码下载

https://github.com/djstava/SwiftForiOS/tree/master/TableViewDemo