swift类型扩展
来源:互联网 发布:广告设计软件学习 编辑:程序博客网 时间:2024/06/06 12:33
/**
1.扩展语法
2.计算型属性
3.构造器
4.方法
5.下标
6.嵌套类型
扩展就是向一个已有的类、结构体或枚举类型添加新功能。包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和OC中的分类(category)类似。不过与OC不同的是,swift的扩展没有名字。
如果定义一个扩展向已有类型添加新功能,那么这个心功能对该类型的所有已有实例中都是可用的,即使他们是在换个扩展的前面定义的
*/
//扩展语法
/**
声明一个扩展使用关键字extension
extension SomeType {
// 加到SomeType的新功能写到这
}
一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议。当这种情况发生时,接口的名字应该完全按照类或结构体的名字的方式进行书写
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这
}
按照这种方式添加的协议遵循者被称之为在扩中添加协议遵循者
*/
//计算型属性
/**
扩展可以向已有类型添加计算型实例属性和计算型类型属性
*/
extension Double {
var km: Double{
return self *1000.0;
}
var m: Double {
return self;
}
var cm: Double {
return self /100.0;
}
var mm: Double {
return self /1000.0;
}
var ft: Double {
return self /3.28084;
}
}
let oneInch = 25.4.mm;
print("One inch is\(oneInch) meters");
let threeFeet = 3.ft;
print("Three feet is\(threeFeet) meters");
let aMarathon = 42.km +195.m;
print("a marathon is\(aMarathon) meters long");
/**
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器
*/
//构造器
/**
扩展可以向已有类型添加新的构造器。这可以让你扩展其它类型,将自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项
如果使用扩展向一个值类型添加一个构造器,该构造器向所有的存储属性提供默认值,而且没有定义任何定制构造器,那么对于来自你的扩展构造器中的值类型,你可以调用默认构造器的成员级构造器,正如在值类型的构造器授权中描述的,如果你已经把构造器写成值类型原始实现的一部分,上述规则不再使用
*/
struct Size {
var width = 0.0, height =0.0;
}
struct Point {
var x = 0.0, y =0.0;
}
struct Rect {
var origin = Point();
var size = Size();
}
let defaultRect = Rect();
//let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0));
extension Rect {
init(center: Point, size:Size) {
let originX = center.x - size.width /2;
let originY = center.y - size.height /2;
self.init(origin:Point(x: originX, y: originY), size: size);
}
}
let centerRect = Rect(center:Point(x: 4.0, y:4.0), size: Size(width:3.0, height: 3.0));
print("X:\(centerRect.origin.x),Y:\(centerRect.origin.y)\nwidth:\(centerRect.size.width),height:\(centerRect.size.height)");
/**
如果你使用扩展提供了一个新的构造器,你依旧有责任保证构造过程能够让所有实例完全初始化
*/
//方法
/**
扩展可以向已有类型添加新的实例方法和类型方法
*/
extension Int {
func repetitons(task: () -> ()) {//表明函数没有参数而且没有返回值
for _ in 0..<self {
task();
}
}
}
3.repetitons({
print("hello~");
});
4.repetitons({
print("world!");
});
//修改实例方法
/**
通过扩展添加实例方法也可以修改该实例本身。结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样
*/
extension Int {
mutating func square() ->Int {
return self * self;
}
}
var someInt = 3;
print(someInt.square());
//下标
/**
扩展可以向一个已有类型添加新下标
逆向下标
*/
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1;
if digitIndex == 0 {
return self % 10;
}
for _ in 1...digitIndex {
decimalBase *= 10;
}
if self / decimalBase <1 {
return 0;
}
return (self / decimalBase) %10;
}
}
print(73456875885[6]);
//嵌套类型
/**
扩展可以向已有的类、结构体和枚举添加新的嵌套类型
*/
extension Character {
enum Kind {
case Vowel, Consonant, Other;
}
var kind: Kind {
switchString(self).lowercaseString {
case"a","e","i","o","u":
return .Vowel;
case"b","c","d","f","g","h","j","k","l","m","n","p","q":
return .Consonant;
default:
return .Other;
}
}
}
func printLetterKinds(word: String) {
print("\'\(word)' is made up of the following kinds of letters:");
for character in word.characters {
switch character.kind {
case .Vowel:
print("vowel");
case .Consonant:
print("Consonant");
case .Other:
print("other");
}
}
}
printLetterKinds("Hello");
- swift类型扩展
- Swift--14类型扩展
- [Swift开发实战]- 类型的扩展
- swift为可选类型添加扩展
- Swift的可选链,类型转换和扩展
- [Swift]扩展
- Swift-扩展
- Swift 扩展
- Swift-扩展
- swift 扩展
- Swift 扩展
- swift 协议和扩展
- Swift-协议和扩展
- Swift 扩展(十七)
- Swift扩展(Extension)
- Swift扩展(Extensions)
- 20.Swift-扩展
- Swift教程之扩展
- javascript 解决IE8 兼容 placeholder 属性 含password
- Shell程序设计(三)— shift和select命令的使用
- 插件
- swift类型嵌套
- 分布式文件存储FastDFS(二)FastDFS安装
- swift类型扩展
- 轻松学习之一--Objective-C消息转发
- ScrollView+ListView冲突问题解决
- webpack学习笔记<使用>
- 分布式文件存储FastDFS(三)FastDFS配置
- Java:单例模式的七种写法
- ambari-server启动时的警告解决方法,WARNING: setpgid(5947, 0) failed - [Errno 13] Permission denied
- PHP网站开发:dreamweamer出现中文乱码的问题
- Android导航栏隐藏与浮现