Swift之基础学习二

//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的一些简单应用,仅供参考。

时间: 2024-10-21 10:40:43

Swift之基础学习二的相关文章

puppet基础学习(二)

puppet基础学习(二) 六.ResourceOrdering(资源定序) 使用变化参数before , require , notify , subscribe catalog是对一个给定的系统的所有资源及关系的编译,在编译catalog时,除非我们指定资源的执行顺序,不然puppet是以其自己的顺序管理,大多数时候puppet指定适当的方式,例如puppet管理用户gigabyte应该存在和文件夹/home/gigabyte/bin应该存在并属于用户gigabyte时,puppet会自动指

Swift基础学习(二)数据类型

在编程语言中,不同的数据信息需要不同的数据类型来存储,计算机内存中针对不同的数据类型它们所分配的内存大小是不同的,特定的值需要特定的类型来声明. Swift 数据类型 内置数据类型 整数 - Int & UInt 根据一个整数变量占据的内存空间(8/16/32/64-bit,现在 iOS 开发基本全部是 64 位)以及整数是否带有符号(Unsinged),Swift 一共定义了 8 种不同的整数类型: Int8/Int16/Int32/Int64 UInt8/UInt16/UInt32/UInt

Swift之基础学习一

Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.2015年的WWDC开发者大会上,苹果公司推出了Swift2.0版本,并且Swfit完全开源.自从Swift发布以来,在http://www.tiobe.com中的排行一直处于上升的状态.swift的使用也更加广泛,越来越多的开发人员,尝试使用swift进行开发. 这里只进行swift的一些基础语法的介绍, //MARK: - 定

CSS入门基础学习二

我们下午继续学习CSS的入门基础,搬上你的小板凳赶快进入吧! 一.背景(background) Background-color:背景颜色 background-image (背景图片) background-repeat(设置背景平铺)  repeat (默认值) no-repeat (不平铺) repeat-x  (横向平铺) repeat-y (纵向平铺) background-position (设置背景位置) 设置具体值: left| right| top| bottom| cnete

HTML基础学习(二)&mdash;CSS

一.CSS概述     CSS(Cascading Stytle Sheets)层叠样式表,用来定义网页的显示效果.可以解决HTNL代码对样式定义的重复,提高了后期样式代码的可维护性,并增强了网页的显示效果.即CSS将网页内容和显示样式分离,提高了显示功能.   二.CSS与HTML结合方式 1.style属性方式      利用标签中style属性来改变每个标签的显示样式. <body> <div style="background-color: #76EE00;"

Mybatis基础学习(二)&mdash;开发Dao方式

一.原始Dao开发方式 UserDao.java public interface UserDao{ public User findUserByID(Serializable id); public List<User> findUsersByName(String name); } UserDaoImpl.java public class UserDaoImpl implements UserDao{ //SqlSessionFactory是单例存在,不应该在具体实例中创建,需要外部依赖

jQuery基础学习(二)&mdash;jQuery选择器

一.jQuery基本选择器 1.CSS选择器     在学习jQuery选择器之前,先介绍一下之前学过的CSS选择器. 选择器 语法 描述 示例   标签选择器 E {                 CSS规则   }   以文档元素为选择符   ID选择器 #ID{                  CSS规则 }   以ID为选择符   类选择器 E.className{                 CSS规则 }   以文档元素的Class为选择符   群组选择器 E1,E2{   

MySQL基础学习二

一,数据库操作 主键 主键是索引的一种,并且是唯一性索引,且必须定义为primary key.一个表只有一个主键,主键可以由多列组成. 声明主键的关键字为:primary key 简单的一个声明主键的示例: create table score(sid int auto_increment primary key)engine=innodb default charset=utf8 primary key为声明的关键字. 外键 如果一个实体的某个字段指向另一个实体的主键,就称为外键. 被指向的实

Struts2基础学习(二)&mdash;Action

一.ActionSupport      为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范.下面是标准Action接口的代码: public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public