learnSwift keep update

开始学习swift,尝试做个小项目,边做边查边记。

  • 函数

func 定义一个函数名,后面括号跟着参数名和参数类型,箭头后是返回值类型
里面还涉及到一个字符串拼接,直接利用+或者+=拼接,不是变量的话需要””包起来。

1
2
3
4
5
6
7
8
9
10
11
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
}
类似于
-(NSSting *)sayHello:(NSString *)personName
{
NSString *greeting = [NSString StringWithFormat:@"Hello, %@!", greeting];
return greeting
}
  • cell & xib 关联

在cell里

1
2
3
4
5
class PurchaseCell: UITableViewCell {
@IBOutlet weak var mainImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
}

在controller里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerNib(UINib(nibName: "PurchaseCell", bundle: nil), forCellReuseIdentifier: "myCell")
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! PurchaseCell
return cell
}
}
  • swift中调用OC的方法

需要创建一样创建一个桥接头文件, 命名方式:项目名-Bridging-Header.h

然后在 项目 - Targets - buildSettings - Swift compiler-Code Generation中的,Objective-C Bridging Header中输入刚才创建的Header File的物理路径。配置完毕可以在HeaderFile中引用OC的文件了。

  • ?和!

在swift定义一个变量的时候,没有初始值。如果直接定义的话会报没有初始值的警告。在UITableView后面加上!告诉编译器这不是一个空值。

?

1
var strValue: String?

表示上面这个Optional的声明,意思不是”我声明了一个Optional的String值”, 而是”我声明了一个Optional类型值,它可能包含一个String值,也可能什么都不包含”,也就是说实际上我们声明的是Optional类型,而不是声明了一个String类型。

  • Alamofire与ObjectMapper

用Alamofire进行网络请求,ObjectMapper进行model的处理。

Alamofire是AFN的作者的另一个作品,但是用起来比AFN轻便了很多,所以我暂时也没有进行二次封装,用法也很简单。

1
2
3
4
5
6
7
8
9
10
11
Alamofire.request(.GET, urlStr!, parameters: nil)
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
let dealModel = Mapper<DealModel>().map(response.result.value
print("total count: \(dealModel!.count)")
}

请求返回的json数据是这样

1
2
3
4
5
6
7
8
9
10
11
{
"status": "OK",
"total_count": 60773,
"count": 20,
"deals": [
{},
{},
{},
...
]
}

根据返回结果设计的DealModel的model类如下,需要一层一层拔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class DealDeatilModel: Mappable {
var status : Int?
var total_count : Int?
var count : Int?
var deals : [DealModel]?
//返回可能为空对象的初始化方法暂时用不到。
required init?(_ map: Map) {
}
func mapping(map: Map) {
status <- map ["status"]
total_count <- map ["total_count"]
count <- map["count"]
deals <- map["deals"]
}
}
class DealModel : Mappable {
var title : String?
var deal_id : String?
var Description : String?
var current_price : String?
var purchase_count : String?
var image_url : String?
required init?(_ map: Map) {
}
func mapping(map: Map) {
title <- map ["title"]
deal_id <- map ["deal_id"]
Description <- map ["Description"]
current_price <- map ["current_price"]
purchase_count <- map ["purchase_count"]
image_url <- map ["image_url"]
}
}

还有个库AlamofireObjectMapper,将两个库结合了起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Alamofire.request(.GET, urlStr!).responseObject {
(response: Response<DealDeatilModel, NSError>) in
let BigModel = response.result.value
print(BigModel?.count)
if let dealModel = BigModel?.deals {
for forecast in dealModel {
self.dataSoure.addObject(forecast)
print(forecast.title)
}
}
}