//
// ViewController10.swift
// swiftT
//
// Created by wjwdive on 2020/5/25.
// Copyright © 2020 wjwdive. All rights reserved.
//
import UIKit
class ViewController10: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var someInt = 3
print("Int 添加了一个 异变方法 求当前Int的平方 ",someInt.square() , someInt)
// extension 为Int 添加方法
someInt.repeatTask {
print("Jarvis ")
}
// extension 为 Double 添加计算属性
let speed: Double = 12000.0
print("extension 为 Double 添加计算属性(doubel 转为km)",speed.km)
}
}
// Swift 扩展 extension
// 1、添加计算实例属性和计算类型方法
// 2、定义实例方法和类型方法
// 3、提供新初始化器
// 4、定义下标
// 5、定义和使用新内嵌类型
// 6、使现有的类型遵循某协议
// 7、扩展可以向一个类型添加新的反法,但是不能重写已有的方法 //和OC的不同之处,OC是可以重写已有的方法的
// 不能添加存储属性
// 2、 扩展可以向已有的类型添加新的初始化器。这允许你扩展其他类型以使初始化器接收你的自定义类型作为形式参数,或提供该类型的原始实现中未包含的额外初始化选项
// 3、扩展能为添加新的便捷初始化器,但是不能为类添加指定初始化器或反初始化器。指定初始化器和反初始化器必须由原来的实现提供
// 扩展的实例方法仍可修改(或异变)实例本身。结构体和枚举类型方法在修改self或本身的属性时必须标记实例方法为mutating,和原本实现的异变方法一样
extension Int{
mutating func square() {
self = self * self
}
}
// 扩展为已有的类型添加新的下标 例如: 通过给整数添加下标,返回整数下标对应的数字
extension Int {
subscript(digitIndex: Int) -> Int {
get{
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
}
// 扩展为已有的类、结构体、枚举 添加新的【内嵌类型】 为Int 添加内嵌类型
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .positive
default:
return .negative
}
}
}
// extension 为Doubel添加计算属性
extension Double {
var km: Double {
return self / 1000.0
}
}
// extension 为Int添加方法
extension Int {
func repeatTask(_ task: () -> ()) {
for _ in 0..<self {
task()
}
}
}