码迷,mamicode.com
首页 > 编程语言 > 详细

Swift之基础学习二

时间:2016-05-26 21:53:57      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

//MARK: - ?(可选类型)和!(强制解包)的区别

var number : Int?
var number1 = number!//程序会崩溃(如果对值为nil的变量进行强制解包,会造成程序崩溃)

//MARK: - 结构体

 1 //1.声明一个结构体
 2 struct Rect {
 3     //声明结构体变量的属性(存储属性)
 4     var x : Float
 5     var y : Float
 6     var width : Float
 7     var heighy : Float
 8     //声明结构体属性,要使用static
 9     static var description : String?
10     //声明一个计算属性(是用来专门计算结构体变量属性的setter方法和getter方法,其本身没有存储功能)
11     var centerX : Float{
12         //setter方法
13         set{
14             x = newValue
15         }
16         //getter方法(必须有)
17         get {
18             return x/2
19         }
20     }
21     var centerY:Float{
22         get {
23             return y/2
24         }
25     }
26     //声明方法 声明一个结构体变量方法(相当于OC中的实例方法)
27     func frameInfor(){
28         print("x:\(x), y:\(y),width:\(width),height:\(heighy)")
29     }
30     //声明一个结构体方法(相当于OC中的类方法),使用static修饰
31     static func info(){
32         print("这是结构体方法");
33     }
34 }
35 //2.根据结构体去定义一个结构体变量
36 var frame = Rect(x: 20, y: 20, width: 100, heighy: 100)
37 //3.访问结构体变量中的属性(通过点语法)
38 frame.x = 20
39 print(frame.x)
40 
41 //4.访问结构体属性
42 Rect.description = "我是结构体属性"
43 
44 print(Rect.description!)
45 
46 //5.访问计算属性
47 frame.centerX = 200; //这句话就相当于在调用centerX的setter方法
48 let value = frame.centerX //这句话就相当于在调用centerX的getter方法
49 print(value)
50 //6.调用结构体变量方法
51 frame.frameInfor()
52 //7.调用结构体变量
53 Rect.info()

//MARK: - 类(class)

 1 class Person {
 2     var name:String?
 3     var age:Int?
 4     //构造初始化方法
 5     init(name:String,age:Int) {
 6         self.name = name
 7         self.age = age
 8     }
 9     //自定义初始化方式
10     init(name:String) {
11         self.name = name
12     }
13     //声明类属性
14     static var introduce:String?
15     //声明计算属性//在写计算属性的时候不能出现self.否则会造成死循环
16     var value:Int{
17         set(a) {
18             age = a
19         }
20         get{
21             return age!
22         }
23     }
24    //声明类方法两种方法
25     //1.在类方法前边加上static修饰【虽然是一个类方法,但是该方法在子类中不能进行重写】
26     static func sayHi(){
27         print(introduce!)//注意:在类方法中只能使用类属性,不能使用对象属性
28     }
29     //2.在类方法前边加上class修饰【它是一个类方法,可以被子类重写】
30     class func sayHello() {
31         print(introduce!)
32     }
33     //声明一个实例方法
34     func sayHi2(){
35         print("hello,我是实例方法")
36     }
37 }
38 
39 //1.创建对象(注意:要初始化对象一定要写初始化构造的方法)
40 var person1 : Person = Person(name: "盖伦", age: 22)
41 //2.访问类中的属性(对象属性)
42 print(person1.name!)
43 //3.访问类方法
44 Person.introduce = "我是类方法"
45 //4.访问计算属性
46 person1.value = 28
47 //print(person1.value)
48 //5.访问类方法
49 Person.sayHello()
50 Person.sayHi()
51 //6.访问实例方法
52 person1.sayHi2()
53 //7.定义一个子类Student,继承Person -————在swift中不支持多继承
54 class Student : Person {
55     //重写父类的方法
56     //重写父类的类方法
57     override class func sayHello() {
58         print("我是Student类,重写了父类(Person)的类方法")
59     }
60     
61     //重写父类中的实例方法
62     override func sayHi2() {
63         print("我是子类,student类,重写了父类中的实例方法")
64     }
65 }
66 
67 //初始化Student对象
68 var student = Student(name: "赵信", age: 12)
69 //调用
70 Student.sayHello()
71 student.sayHi2()

//MARK: - 值类型和引用值类型的区别(注意两个类型的打印结果)

 1 //值类型
 2 struct animal{
 3     
 4     var name:String?
 5     var age:Int?
 6     init(name:String,age:Int){
 7         self.name = name
 8         self.age = age
 9     }
10 }
11 var dog1 = animal(name: "藏獒", age: 2)
12 var dog2 = dog1
13 dog1.name = "换换"
14 print("dog1.name:\(dog1.name!)")//打印结果为:欢欢
15 print("dog2.name:\(dog2.name!)")//打印结果为:藏獒
16 //引用值类型
17 class animal1{
18     
19     var name:String?
20     var age:Int?
21     init(name:String,age:Int){
22         self.name = name
23         self.age = age
24     }
25 }
26 var dog3 = animal1(name: "贝贝", age: 12)
27 var dog4 = dog3
28 dog3.name = "欢欢"
29 print("dog3.name:\(dog3.name!)")//打印结果为:欢欢
30 print("dog4.name:\(dog4.name!)")//打印结果为:欢欢

//MARK: - 协议(protocol)

 1 //使用swift声明协议的时候,协议里需要使用可选方法,使用@objc关键字修饰
 2 @objc protocol CookDelegate{
 3     func potato()
 4     func tomato()
 5    optional func meat()
 6 }
 7 //协议中没有可选方法
 8 protocol DrinkDelegate{
 9     func drink()//
10 }
11 //如果一个类要遵循协议的时候,如果这个类有父类,要在:后先写父类,然后,再写要遵循的协议
12 class Man: Person,CookDelegate,DrinkDelegate {
13     @objc func potato() {
14         print("土豆")
15     }
16     @objc func tomato() {
17         print("西红柿")
18     }
19     func drink() {
20         print("喝酒")
21     }
22 }
23 //创建一个男人
24 let man = Man(name: "韦小宝", age: 22)
25 man.potato()
26 man.tomato()
27 man.drink()

//MARK: - 扩展(Extension)

 1 //1.扩展协议中的相关方法
 2 extension Man{
 3    @objc func meat() {
 4         print("吃肉")
 5     }
 6 }
 7 man.meat()
 8 //2.扩展还可以扩展类方法(给某一个类添加方法,类似于OC中的Category)以及对象方法
 9 extension Man{
10     //扩展一个对象方法
11     func sing(){
12         print("你存在我深深的脑海里,我的脑海里,脑海里,里")
13     }
14     //扩展一个类方法
15     class func sleep() {
16         print("多喝水多喝水,多休息,多休息")
17     }
18 }

//MARK: - 闭包

 

 1 //求两个数的最大值
 2 /*
 3 在OC中使用Block实现
 4 int (^myBlock)(int num1, int num2) = ^int (int num1, int num2) {
 5     return num1 > num2 ? num1:num2;
 6 }
 7 */
 8 //使用闭包(里面的小括号是参数)指向返回值类型
 9 var myBlock : ((num1:Int, num2:Int)->Int)
10 
11 //第一种使用方式
12 myBlock = {
13     (num1:Int, num2:Int)->Int in    //进入闭包里面
14     return num1 > num2 ? num1 : num2
15 }
16 
17 //第二种方式
18 myBlock = {
19     num1,num2 in
20     return num1 > num2 ? num1 : num2
21 }

最后是一个通讯录的小工程:

所需创建的文件列表

技术分享

“ContactListTableViewController”联系人控制器,用于显示联系人;“AddContactViewController”添加联系人时跳转到的界面;“ContactModel”联系人模型;“DataManager”封装对数据的处理方法;注意::不需要引入任何头文件

DataManager文件代码:

 1 class DataManager: NSObject {
 2     //声明存储联系人的数组
 3     var contactArray = Array<ContactModel>()
 4     //声明计算属性,计算数组的个数
 5     var count:Int {
 6         get{
 7             return contactArray.count
 8         }
 9     }
10     //创建单例对象
11     //为了防止外部不会再次初始化
12     private override init() {
13     }
14     static let shareInstence = DataManager()
15     //添加联系人
16     func addContactToArray(newContact:ContactModel) {
17         self.contactArray.append(newContact)
18     }
19     //根据下标去展示相关的联系人(根据下标取model对象)
20     func contactAtIndexFromArray(index:Int) ->ContactModel {
21         return self.contactArray[index]
22     }
23     //更新联系人的方法
24     func updateContactInArray(newContact:ContactModel,index:Int) ->Void{
25         //老数据删除
26         self.contactArray.removeAtIndex(index)
27         //新数据插入
28         self.contactArray.insert(newContact, atIndex: index)
29     }
30     //删除联系人
31     func deleteContactFromArray(index:Int)->Void {
32         self.contactArray.removeAtIndex(index)
33         
34     }
35 }

“ContactModel”联系人模型,代码:

 1 class ContactModel: NSObject {
 2     var name:String?
 3     var phone:String?
 4     
 5     init(name:String,phone:String) {
 6         super.init()
 7         self.name = name
 8         self.phone = phone
 9     }
10 
11 }

“ContactListTableViewController”联系人控制器,代码

 1 class ContactListTableViewController: UITableViewController {
 2 
 3     override func viewDidLoad() {
 4         super.viewDidLoad()
 5 
 6       //创建一个添加按钮
 7         let leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: Selector("addButtonAction"))
 8     
 9     self.navigationItem.leftBarButtonItem = leftBarButtonItem
10     }
11 //MARK: - 添加按钮的响应方法
12     func addButtonAction() {
13         //跳转新的界面
14         let addVC = AddContactViewController()
15         //实现闭包的回调
16         addVC.myBlock = {
17              (str)->Void in
18             print(str)
19             self.tableView.reloadData()
20         }
21         self.navigationController?.pushViewController(addVC, animated: true)
22     }
23     // MARK: - Table view data source
24     //section
25     override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
26         return 1
27     }
28    //row
29     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
30         return DataManager.shareInstence.contactArray.count
31     }
32    //cell
33     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
34         var cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier")
35         if cell == nil {
36             cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "reuseIdentifier")
37         }
38         //先取出联系人
39         let contact = DataManager.shareInstence.contactAtIndexFromArray(indexPath.row)
40         cell?.textLabel?.text = contact.name
41         cell?.detailTextLabel?.text = contact.phone
42         return cell!
43     }
44     //实现选中cell跳转下一界面进行值的修改
45     override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
46        let addVC = AddContactViewController()
47         //这里需要将联系人的姓名和电话传到下个textField中,此时需要借助属性传值
48         let contact = DataManager.shareInstence.contactAtIndexFromArray(indexPath.row)
49         addVC.contact = contact
50         addVC.index = indexPath.row
51         //闭包的回调
52         addVC.myBlock = {
53             (str)->Void in
54             print(str)
55             self.tableView.reloadData()
56         }
57         self.navigationController?.pushViewController(addVC, animated: true)
58     }
59     
60     // Override to support editing the table view.//侧滑删除
61     override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
62         if editingStyle == .Delete {
63             // Delete the row from the data source
64             
65             DataManager.shareInstence.deleteContactFromArray(indexPath.row)
66             tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
67             
68         } else if editingStyle == .Insert {
69             // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
70         }    
71     }
72 }

“AddContactViewController”添加联系人时跳转到的界面,代码,

 1 //定义一个有参无返的block
 2 typealias BLOCK = (_:String)->Void
 3 class AddContactViewController: UIViewController {
 4     
 5     //声明控件属性
 6     var nameTextField:UITextField?
 7     var phoneTextField:UITextField?
 8     var saveButton:UIButton?
 9 
10     //声明一个闭包
11     var myBlock:BLOCK?
12     
13     //声明用于接收上个界面传过来的联系人对象
14     var contact:ContactModel?
15     //声明用于接收cell位置的属性
16     var index:Int?
17 
18     override func viewDidLoad() {
19         super.viewDidLoad()
20         self.view.backgroundColor = UIColor.whiteColor()
21         //设置控件frame
22         self.nameTextField = UITextField(frame: CGRect(x: 30, y: 100, width: self.view.frame.size.width - 60, height: 40))
23         self.phoneTextField = UITextField(frame: CGRect(x: 30, y: 140, width: self.view.frame.size.width - 60, height: 40))
24         //进行判断显示相关textField中的内容
25         if contact != nil {
26             self.nameTextField?.text = contact?.name
27             self.phoneTextField?.text = contact?.phone
28         } else{
29             self.nameTextField?.placeholder = "请输入要添加的联系人的姓名"
30             self.phoneTextField?.placeholder = "请输入联系方式"
31         }
32         self.view.addSubview(self.nameTextField!)
33         self.view.addSubview(self.phoneTextField!)
34         //保存按钮
35         self.saveButton = UIButton(type: UIButtonType.Custom)
36         self.saveButton?.frame = CGRect(x: 30, y: 180, width: self.view.frame.size.width - 60, height: 40)
37         self.saveButton?.addTarget(self, action: Selector("saveAction"), forControlEvents: UIControlEvents.TouchUpInside)
38         self.saveButton?.setTitle("保存", forState: UIControlState.Normal)
39         self.saveButton?.backgroundColor = UIColor.cyanColor()
40         self.view .addSubview(self.saveButton!)
41     }
42     //MARK: - 保存按钮的响应方法
43     func saveAction() {
44         //分析contact对象是否为空,如果为空,当前操作是添加操作,否则为修改操作
45         //点击保存按钮将新的model类添加到数组中
46         let newContact = ContactModel(name: (self.nameTextField?.text)!, phone: (self.phoneTextField?.text)!)
47         if contact != nil{
48             //修改操作
49             DataManager.shareInstence.updateContactInArray(newContact, index: index!)
50         } else{
51             //保存操作
52             DataManager.shareInstence.addContactToArray(newContact)
53         }
54         //先在当前界面响应一下block
55         self.myBlock!("添加联系人")
56         self.navigationController?.popViewControllerAnimated(true)
57         
58     }
59 }

以上只是swift的一些简单应用,仅供参考。

 

Swift之基础学习二

标签:

原文地址:http://www.cnblogs.com/bdlfbj/p/5532721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!