學習文章
類圖
類適配器類圖.png
對象適配器類圖.png
說明
- 類適配器: 通過繼承要被適配的類,并實現新的接口要求(協議),來適配
- 對象適配器: 實現新的接口要求(協議),并引用要被適配的對象,通過判斷對象的類型做出相應的處理,來適配
源碼
StudentModel.swift
import Foundation
class StudentModel {
var firstName : String!
var secondName : String?
var lastName : String!
var studentAge : Int!
var hobby : String!
}
TeacherModel.swift
import Foundation
class TeacherModel {
var teacherName : String!
var teacherAge : Int!
var major : String!
}
CardView.swift
import UIKit
enum CardViewError : ErrorType {
case FrameTooSmallError
}
class CardView: UIView {
var nameLabel : UILabel!
var ageLabel : UILabel!
var descriptionLabel : UILabel!
override init(frame: CGRect) {
let frameIsAvailable : Bool = frame.width >= 40 && frame.height >= 160
assert(frameIsAvailable, "寬度應大于40,高度應大于160")
super.init(frame: frame)
self.nameLabel = UILabel(frame: CGRect(x: 30, y: 30, width: frame.width - 30.0, height: 30))
self.ageLabel = UILabel(frame: CGRect(x: 30, y: 30 + 30 + 20, width: frame.width - 30.0, height: 30))
self.descriptionLabel = UILabel(frame: CGRect(x: 30, y: 30 + 30 + 20 + 30 + 20, width: frame.width - 30.0, height: 30))
self.addSubview(self.nameLabel)
self.addSubview(self.ageLabel)
self.addSubview(self.descriptionLabel)
self.layer.borderWidth = 0.5
self.backgroundColor = UIColor.orangeColor()
}
convenience init(frame: CGRect, name: String, age: String, description: String ) {
self.init(frame:frame)
self.nameLabel.text = name
self.ageLabel.text = age
self.descriptionLabel.text = description
}
func loadData(data : ProfileProtocol) {
self.nameLabel.text = data.name
self.ageLabel.text = data.age
self.descriptionLabel.text = data.description
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
ProfileProtocol.swift
import Foundation
protocol ProfileProtocol {
var name : String {get}
var age : String {get}
var description : String {get}
}
StudentModelAdapter.swift
import UIKit
// StudentModel 類適配器
class StudentModelAdapter: StudentModel, ProfileProtocol {
var name : String {
get {
return self.firstName + " " + self.lastName
}
}
var age : String {
get {
return "\(self.studentAge)"
}
}
var description : String {
get {
return self.hobby
}
}
}
TeacherModelAdapter.swift
import UIKit
// TeacherModel 類適配器
class TeacherModelAdapter: TeacherModel, ProfileProtocol {
var name : String {
get {
return self.teacherName
}
}
var age : String {
get {
return "\(self.teacherAge)"
}
}
var description : String {
get {
return self.major
}
}
}
CommanAdapter.swift
import UIKit
// 對象適配器
class CommanAdapter: ProfileProtocol {
var model : AnyObject
init(model : AnyObject) {
self.model = "Error Model"
if model.dynamicType == StudentModel.self {
self.model = model as! StudentModel
} else if model.dynamicType == TeacherModel.self {
self.model = model as! TeacherModel
}
}
var name : String {
get {
if self.model.dynamicType == StudentModel.self {
let studentModel = model as! StudentModel
return studentModel.firstName + " " + studentModel.lastName
} else if self.model.dynamicType == TeacherModel.self {
let teacherModel = model as! TeacherModel
return teacherModel.teacherName
}
return "Error Name"
}
}
var age : String {
get {
if self.model.dynamicType == StudentModel.self {
let studentModel = model as! StudentModel
return "\(studentModel.studentAge)"
} else if self.model.dynamicType == TeacherModel.self {
let teacherModel = model as! TeacherModel
return "\(teacherModel.teacherAge)"
}
return "Error Age"
}
}
var description : String {
get {
if self.model.dynamicType == StudentModel.self {
let studentModel = model as! StudentModel
return studentModel.hobby
} else if self.model.dynamicType == TeacherModel.self {
let teacherModel = model as! TeacherModel
return teacherModel.major
}
return "Error Description"
}
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
var cardView : CardView!
override func viewDidLoad() {
super.viewDidLoad()
self.buildCardView()
// 我們要實現一個名片,但是model提供的數據并不能直接給CardView使用,這樣的情況就需要我們使用適配器模式
// 我們定義一個協議來滿足CardView對數據的要求,并為CardView添加方法 loadData(data : ProfileProtocol)來加載數據
self.useClassAdapter()
// self.useObjectAdapter()
}
/**
創建名片View
*/
func buildCardView() {
self.cardView = CardView(frame: CGRect(x: 50, y: 50, width: 250, height: 200))
self.view.addSubview(self.cardView)
}
/**
使用類適配器
*/
func useClassAdapter() {
let studentModel = StudentModelAdapter()
studentModel.firstName = "Jim"
studentModel.lastName = "Green"
studentModel.studentAge = 17
studentModel.hobby = "Play BasketBall"
self.cardView.loadData(studentModel)
}
/**
使用對象適配器
*/
func useObjectAdapter() {
let teacherModel = TeacherModel()
teacherModel.teacherName = "Steve Jobs"
teacherModel.teacherAge = 45
teacherModel.major = "Coding"
let commonAdapter = CommanAdapter(model: teacherModel)
self.cardView.loadData(commonAdapter)
}
}