//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