P- OP能彌補OOP一些設計上的不足編程
class BVC: UIViewController {
func run() {
print("run")
}
}複製代碼
class DVC: UITableViewController {
func run() {
print("run")
}
}複製代碼
protocol Runnable {
func run()
}
extension Runnable {
func run() {
print("run")
}
}複製代碼
class BVC: UIViewController, Runnable {}
class DVC: UIViewController, Runnable {}複製代碼
struct My {
var string: String
init(_ string: String) {
self.string = string
}
var numberCount: Int {
var count = 0
for c in string where("0"..."9").contains(c) {
count += 1
}
return count
}
}
extension String {
var my: My { return My(self) }
}
print("123kkk".my.numberCount) // 3複製代碼
struct My<Base> {
var base: Base
init(_ base: Base) {
self.base = base
}
}複製代碼
extension My where Base == String {
var numberCount: Int {
var count = 0
for c in base where("0"..."9").contains(c) {
count += 1
}
return count
}
}複製代碼
class Person {}
extension Person {
var my: My<Person> { My(self) }
static var my: My<Person>.Type { My(Person).self }
}
extension My where Base == Person { // 須要給對應子類擴充的話使用冒號,例如:Base: Person
func run() {
print("run")
}
static func test() {
print("test")
}
}
Person().my.run()
Person.my.test()複製代碼
protocol MyCompatible {}
extension MyCompatible {
var my: My<Self> { My(self) }
static my: My<Self>.Type { My<Self>.self }
}
class String {}
extension String: MyCompatible {}複製代碼
/// 前綴類型
struct My<Base> {
var base: Base
init(_ base: Base) {
self.base = base;
}
}
/// 利用協議擴展前綴屬性
protocol MyCompatible {}
extension MyCompatible {
var my: My<Self> {
set {} // *** 爲了擴充mutating方法,因此不能寫只讀屬性
get { My(self) }
}
static var my: My<Self>.Type {
set {} // *** 爲了擴充mutating方法,因此不能寫只讀屬性
get { My<Self>.self }
}
}
/// 給字符串擴展功能
// 讓String擁有my前綴屬性
extension String : MyCompatible {}
// 給String前綴擴展功能
extension My where Base == String {
var numberCount: Int {
var count = 0
for c in base where("0"..."9").contains(c) {
count += 1
}
return count
}
mutating func run() {}
static func test() {}
}
var str = "666"
str.my.run()
String.my.test()複製代碼
class Person {}
class Student: Person {}
extension Person: MyCompatible {}
extension My where Base: Person {
func run() {}
static func test() {}
}
Person.my.test()
Student.my.test()
let p = Person()
p.my.run()
let s = Student()
s.my.run()複製代碼
extension String: MyCompatible {}
extension NSString: MyCompatible {}
extension My where Base: ExpressibleByStringLiteral {
var numberCount: Int {
var count = 0
for c in (base as! String) where("0"..."9").contains(c) {
count += 1
}
return count
}
mutating func run() {}
static func test() {}
}
var str1 = "123xxx"
var str2: NSString = "123xxx"
var str3: NSMutableString = "123xxx"
print(str1.my.numbserCount)
print(str2.my.numbserCount)
print(str3.my.numbserCount)複製代碼
func isArray(_ value: Any) -> Bool {
// value is Array<Any>
value is [Any]
}
print(isArray([1, 2])) // true
print(isArray(["1", 2])) // true
print(isArray(NSArray())) // true
print(isArray(NSMutableArray())) // true
print(isArray("12312421")) // false複製代碼
protocol ArrayType {}
extension Array: ArrayType {}
extension NSArray: ArrayType {}
func isArrayType(_ type: AnyType) -> Bool { type is ArrayType.Type }
isArrayType([Int].self)
isArrayType([Any].self)
isArrayType(NSArray.self)
isArrayType(NSMuatbleArray.self)複製代碼