1.初始化方法和类方法
定义一个类,继承与 NSObject 在里面写如下代码
import UIKit
class Person: NSObject {
var name:String?
var age:Int?
// init 初始化方法
override init() {
super.init()
name = "nihao"
age = 18
}
// 重载 init 方法
init(name:String,age:Int) {
super.init()
self.name = name
self.age = age
}
func sayHi(){
print("ni hao")
}
// 类方法
// 写法1:用 class 修饰,表示类方法,能够被子类重载
class func saySomething() {
print("6666")
}
class func PersonWithAndAge(name:String,age:Int)->Person {
let p = Person(name: name, age: age)
return p
}
// 写法2:用 static 修饰,也表示类方法,不能够被子类重载
static func eatSomething(){
print("eat food")
}
}
创建一个 student 类,继承与 Person
import UIKit
class Student: Person {
func sayHai() {
print("say hai")
}
}
在 viewController.swift 中调用类中的方法
import UIKit
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
// 调用init 初始化方法
let person1 = Person()
print(person1.name,person1.age)
// 重载的 init 方法
let person2 = Person(name:"nihao",age:18)
print("person2.name = \(person2.name!),person2.age = \(person2.age!)")
person2.sayHi()
// 如果要去掉打印可选类型的 optional 字样,对可选类型进行强制解包就可以了
let stu = Student()
stu.sayHai()
let stu = Student(name: "123", age: 11)
stu.sayHai()
Person.saySomething()
Person.eatSomething()
2.KVC
创建一个类,继承与 NSObject
import UIKit
class Animal: NSObject {
// KVC 调用流程: KVC 是一种通过字符串间接的访问对象属性的一种方式
// 1.调用 setValuesForKeysWithDictionary
// 2.调用 setValue:forKey
// 如果有找到对象的 key 值,则初始化并且赋值,没有的话则到第三步
// 3.setValue:forUndeFinedKey:
var name:String?
var age:Int = 0// 基本数据类型在模型里面不能为可选类型,否则在 KVC 赋值的时候会找不到相应的 key 值
var gender:String?
init(dict:[String:AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
override func setValue(value: AnyObject?, forKey key: String) {
super.setValue(value, forKey: key)
}
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
}
}
在 viewController.swift 中调用类中的方法
import UIKit
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let dict = ["name":"xiazi","age":69,"gender":"雄"]
let animal = Animal(dict: dict)
print("name = \(animal.name),age = \(animal.age),gender = \(animal.gender)")
3.单例
import UIKit
class SingleTon: NSObject {
var name:String?
// swift 单例写法1
/* 格式:
static let 名字:类型 = {
let instance = 类型()
return instance
}()
*/
static let shareSingleTon:SingleTon = {
let instance = SingleTon()
return instance
}()
// swift 单例写法2
/* 格式:
static let instance = 类名()
class func shareSingleTon()->返回值类型
{
return instance
}
*/
static let instance = SingleTon()
class func shareSingleTon()->SingleTon {
return instance
}
}
调用
// 单例写法1
let s1 = SingleTon.shareSingleTon
s1.name = "nima"
let s2 = SingleTon.shareSingleTon
print("s2.name = \(s2.name)")
let s3 = SingleTon.shareSingleTon
print("s3.name = \(s3.name)")
// 单例写法2
let s1 = SingleTon.shareSingleTon()
s1.name = "nima"
let s2 = SingleTon.shareSingleTon()
print("s2.name = \(s2.name)")
let s3 = SingleTon.shareSingleTon()
print("s3.name = \(s3.name)")
4.协议
import UIKit
// protocol 标识符如果前面没有@objc 的话,表示协议里面的方法都必须实现
protocol womanDelegate
{
func manMakeMoney()
}
// 如果协议里面有一些方法是选择实现的,必须在标识符 protocol 前面加上@objc, 并且选择实现的那些方法前面要加上 optional 修饰,必须实现的方法则一样不用修饰符
@objc protocol womanOptionalDelegate{
// 可选择实现的方法
optional func washClothes()
// 必须实现的方法
func introduceSelf()
}
class Woman: NSObject {
var delegate:womanDelegate?
var optionalDelegate:womanOptionalDelegate?
}
遵守协议
class ViewController:UIViewController,womanDelegate,womanOptionalDelegate {
调用
// 协议
let woman = Woman()
woman.delegate = self
woman.optionalDelegate = self
woman.delegate?.manMakeMoney()
func manMakeMoney() {
print("man make money")
}
func introduceSelf() {
print("i am woman")
}
5.网络请求
// 网络请求
// 以后写闭包回调的时候要把参数都写成可选类型
let urlString = "http://mobile.ximalaya.com/mobile/others/ca/album/track/5541/true/1/15"
let url = NSURL(string: urlString)
let dataTask = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in
// try 如果有错的话警告
// try! 如果有出错直接程序崩溃
// try? 返回值是可选类型的
if let temp = data{
do{
let rootDict = try NSJSONSerialization.JSONObjectWithData(temp, options: NSJSONReadingOptions.MutableContainers)
print(rootDict)
}catch{
print(error)
}
}
}
dataTask.resume()