读Swift官方文档的收获(二)

<四>对象和类

1.使用class来声明一个类,有类似于java中类的定义和访问:
(1)使用点语法来访问实力的属性和方法,
(2)创建构造器使用的是init.
(3)在删除对象之前需要进行清理,使用deinit创建析构函数,
(4)子类的定义方法是在其类名的后面加上父类的名字,并用” : “隔开.
(5)子类如果想要重写父类的方法的话需要用override标记

    class NameShap : Name{         //继承于父类Name(例)
        var number : int = 0
        var name : string
        init(name :string) {
            self.name = name
        }
        override  func SimpleDescription ()->string {   //重写父类的方法(例)
        return "A shape with \(number) sides."
        }
    }
    创建实例: var nameShap = NameShap( )
    访问属性:nameShap.number = 8
    访问方法:var simpleDescription =  nameShap.SimpleDescription()

2.类中的方法和一般的函数有一个重要的区别,函数的参数只是在函数的内部使用,但是方法的参数名需要在调用的时候显示说明,默认情况下,方法的参数名和它在方法内部的名字一样.
3.处理变量的可选值时,可以在操作(比如方法、属性和子脚本)之前加?。如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil。否则,?之后的东西都会被运行。
let optionalSquare: Square? = Square(sideLength: 2.5, name: “optional square”)

<五>枚举和结构体

1.枚举的创建依然使用enum, 而且枚举可以同其他所有的命名类型一样可以包含方法.

    enum Rank: Int { 
        case Ace = 1 
        case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten 
        case Jack, Queen, King 
        func simpleDescription() -> String { 
            switch self { 
            case .Ace: 
                return "ace" 
            case .Jack: 
                return "jack" 
            case .Queen: 
                return "queen" 
            case .King: 
                return "king" 
            default: 
                return String(self.toRaw()) 
            } 
        } 
    } 
    let ace = Rank.Ace 
    let aceRawValue = ace.toRaw() 

2.结构体.使用struct来创建,结构体和类有很多相同的地方,比如方法和构造器。它们结构体之间最大的一个区别就是 结构体是传值,类是传引用, 而且结构体不能被继承。

struct Point {    //结构体
    var x = 0.0
    var y = 0.0
}
struct Size {
    var width = 0.0
    var height = 0.0
}
struct MyRect {
var origin = Point()  //  存储属性
var size = Size()
var center:Point{     //  计算属性
    get{
        let centerX = origin.x + size.width / 2
        let centerY = origin.y + size.height / 2
        return Point(x : centerX, y : centerY)
    }
    set(newCenter){
        origin.x = newCenter.x - size.width / 2
        origin.y = newCenter.y - size.height / 2
    }
}
init(origin:Point, size:Size){ //  计算属性
    self.origin = origin
    self.size = size
    }
}   
    var myFrame = MyRect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 100, height:100))
    myFrame.center

<六>接口和扩展

1.使用protocol来声明一个接口(ios中叫做协议)

    protocol ExampleProtocol { 
        var simpleDescription: String { get } 
        mutating func adjust() 
    } 

类、枚举和结构体都可以实现接口。

    //类签订协议如果该类还继承父类则可以写为  : 父类名 , 协议名
    class SimpleClass: ExampleProtocol { 
        var simpleDescription: String = "A very simple class." 
        var anotherProperty: Int = 69105 
        func adjust() { 
            simpleDescription += "  Now 100% adjusted." 
        } 
    } 
    var a = SimpleClass() 
    a.adjust() 
    let aDescription = a.simpleDescription 
     //结构体 
    struct SimpleStructure: ExampleProtocol { 
        var simpleDescription: String = "A simple structure" 
        mutating func adjust() { 
            simpleDescription += " (adjusted)" 
        } 
    } 
    var b = SimpleStructure() 
    b.adjust() 
    let bDescription = b.simpleDescription 

声明SimpleStructure时候使用mutating关键字用来标记一个会修改结构 体的方法。SimpleClass的声明不需要标记任何方法因为类中的方法经常会修改类。
2.扩展 :使用extension来为现有的类型添加功能,可以使用扩展来给任意类型添加协议,甚至是从外部库或者框架中导入的类型.

    extension Int: ExampleProtocol { 
        var simpleDescription: String { 
        return "The number \(self)" 
        } 
        mutating func adjust() { 
            self += 42 
        } 
    } 
     print(7.simpleDescription)

<七>泛型

表示木有看的很明白,泛型到底怎么用,贴上了文档的翻译.
在尖括号里写一个名字来创建一个泛型函数或者类型。
func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] {
var result = [Item]()
for _ in 0..<numberOfTimes {
    result.append(item)
}
return result
}
repeatItem("knock", numberOfTimes:4)

你可以创建泛型函数和方法,还可以创建类,枚举,结构体

// Reimplement the Swift standard library's optional type
enum OptionalValue<Wrapped> {
case None
case Some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)

在类型名后面使用where来指定一个需求列表——例如,要限定实现一个协议的类型,需要限定两个类型要相同,或者限定一个类必须有一个特定的父类。

func anyCommonElements <T: SequenceType, U: SequenceType where T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, _ rhs: U) -> Bool {
for lhsItem in lhs {
    for rhsItem in rhs {
        if lhsItem == rhsItem {
            return true
        }
     }
  }
return false
}
anyCommonElements([1, 2, 3], [3])

简单起见,你可以忽略where,只在冒号后面写接口或者类名。和是等价的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值