可以用 if-let 语句检查一个可选变量是否包 含值。如果包含,则将这个值指定给一个常量变量,然后运行某段代码。这样可以减少很 多行代码,同时又能够保证安全性var conditionalString : String? = "a string" if let theString = conditionalString? { println("The string is "(theString)"") } else { println("The string is nil")}// 输出 "The string is "a string""
class Vehicle {var color: String?var maxSpeed = 80func description() -> String {return "A (self.color) vehicle"}func travel() {print("Traveling at (maxSpeed) kph")}}
使用
var redVehicle = Vehicle()redVehicle.color = "Red"redVehicle.maxSpeed = 90redVehicle.travel() // 输出"Traveling at 90 kph" redVehicle.description() // = "A Red vehicle"
继承
要重写一个函数,要在子类中重新声明它,并添加 override 关键字class Car: Vehicle {// 继承类可以重写函数 override func description() -> String { var description = super.description() return description + ", which is a car"} }在一个被重写的函数中,可以通过 super 回调该函数在父类中的版本override func description() -> String { var description = super.description() return description + ", which is a car"}
初始化与反初始化
class InitAndDeinitExample {// 指定的初始化器(也就是主初始化器)init() {print("I"ve been created!")}// 便捷初始化器,是调用上述指定初始化器所必需的convenience init (text: String) {self.init() // 这是必需的print("I was called with the convenience initializer!")}// 反初始化器deinit {print("I"m going away!")}}var example : InitAndDeinitExample?// 使用指定的初始化器example = InitAndDeinitExample() // 输出"I"ve been created!"example = nil // 输出"I"m going away"// 使用便捷初始化器example = InitAndDeinitExample(text: "Hello")// 输出"I"ve been created!"// 然后输出"I was called with the convenience initializer"创建一个可以返回 nil 的初始化器(也称为可以失败的初始化器),就在 init 关键字的后面放上一个问号,并在初始化器确定它不能成功地构造该对象时,使用 return nil:convenience init? (value: Int) {self.init()if value > 5 {// 不能初始化这个对象;返回nil,表示初始化失败 return nil} }在使用一个可以失败的初始化器时,任何可以在其中存储该结果的变量都是可选的:let failableExample = InitAndDeinitExample(value: 6)// = nil
协议
使用协议的好处是,可以利用 Swift 的类型体系来引用任何遵守某一给定协议的对象,个人现在理解为是Interface概念。protocol Blinking{var isBlinking:Bool{get}var blinkSpeed: Double { get set }func startBlinking(blinkSpeed: Double) -> Void}class Light:Blinking{var isBlinking = falsevar blinkSpeed = 1.2func startBlinking(blinkSpeed: Double) {print("now my speed is (self.blinkSpeed)")}}
扩展
extension Int { var doubled : Int { return self * 2 } func multiplyWith(anotherNumber: Int) -> Int { return self * anotherNumber} }2.doubled// = 44.multiplyWith(32) // = 128还可以利用扩展使一个类型遵守一个协议extension Int : Blinking {var isBlinking : Bool {return false;}var blinkSpeed : Double {get {return 0.0; }set {// 不做任何事情} }func startBlinking(blinkSpeed : Double) {print("I am the integer (self). I do not blink.")} }2.isBlinking // = false2.startBlinking(2.0) // 输出"I am the integer 2. I do not blink."
访问控制
在将一个方法或属性声明为 public 时,App 中的所有人都能看到它:// 可供所有人访问public var publicProperty = 123//如果将一个方法或属性声明为 private,那只能在声明它的源文件内部看到它:// 只能在这个源文件中访问private var privateProperty = 123// 仅能供本模块访问// 这里的"internal"是默认的,可以省略 internal var internalProperty = 123
运算符重载
类似C++的运算符重载class Vector2D {var x : Float = 0.0var y : Float = 0.0init (x : Float, y: Float) {self.x = xself.y = y} }func +(left : Vector2D, right: Vector2D) -> Vector2D {let result = Vector2D(x: left.x + right.x, y: left.y + right.y)return result}let first = Vector2D(x: 2, y: 2)let second = Vector2D(x: 4, y: 1)let result = first + second
泛型
Swift与Java泛型相同class Tree <T> {// "T"现在可以用作一种类型 var value : Tvar value:Tvar children : [Tree <T>] = []init(value : T) {self.value = value}func addChild(value : T) -> Tree <T> {var newChild = Tree<T>(value: value)children.append(newChild)reutrn newChild}}// 整数树let integerTree = Tree<Int>(value: 5)// 可以增加包含Int的子树 integerTree.addChild(10)//用Swift设计程序 | 45integerTree.addChild(5)// 字符串树let stringTree = Tree<String>(value: "Hello")stringTree.addChild("Yes")stringTree.addChild("Internets")
字符串
比较字符串let string1 : String = "Hello" let string2 : String = "Hel" + "lo" if string1 == string2 { println("The strings are equal")}查找字符串 if string1.hasPrefix("H") { println("String begins with an H") } if string1.hasSuffix("llo") { println("String ends in "llo"") }
数据
let stringToConvert = "Hello, Swift"let data = stringToConvert.dataUsingEncoding(NSUTF8StringEncoding)
Swift with cocoa用Xcode开发软件
打开Xcode 7.2
STEP1
打开Xcode新建Project选择OSX Application ?
STEP2
?
STEP3
打开Main.storyboard,在ViewController中拖入Label?
STEP4
修改ViewController.swift代码import Cocoaclass ViewController: NSViewController {@IBOutlet weak var timestamp:NSTextField!@IBOutlet weak var dateLabel:NSTextField!@IBAction func calc(sender:NSButton){//将输入的字符串转为NSStringlet string = NSString(string: self.timestamp.stringValue)//转为double类型let ts:NSTimeInterval = string.doubleValue//转换日期let date = NSDate(timeIntervalSince1970: ts)//日期格式化let dfmatter = NSDateFormatter()dfmatter.dateFormat="yyyy年MM月dd日"//显示到LabeldateLabel.stringValue = dfmatter.stringFromDate(date)}override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.}override var representedObject: AnyObject? {didSet {// Update the view, if already loaded.}}}上述的NSTextField后面的叹号,它被称为隐式拆封的可选类型,是一种特殊类型,指出变量可能有值,也可能为nil。Swift运行 环境不喜欢访问值为nil的变量,因此Swift程序员必须知晓变量的值,尤其在其可能为nil时。 将变量声明为隐式拆封的可选类型相当于告诉Swift编译器,你承诺在该变量的值为nil时绝 不会访问它。这是你与编译器签订的一个合约,你必须遵守。如果你不遵守,在变量为nil时访 问它,将引发运行阶段错误,导致应用程序停止运行另外也可以开启两个视图直接拖入例如: ?