2010 年 7 月,苹果开发者工具部门总监 克里斯·拉特纳 开始着手 Swift 编程语言的设计工作

用一年时间,完成基本架构
Cocoa 和 Cocoa Touch 框架Smalltalk 的语法,全面改为句点表示法1.2,测试版本是 2.0会 Swift 开发 无疑会增加自身筹码《The Swift Programming Language》中文版 http://numbbbbb.gitbooks.io/-the-swift-programming-language-/
swifter 作者王巍,需要付费购买 http://onevcat.com
// 定义变量
var i = 10
print(i)
i = 15
print(i)
let j = 20
// 常量一经定义不能自改数值
// j = 25
print(j)
var 定义变量,设置之后可以修改let 定义常量,设置之后不可以修改;print() 替代 OC 中的 NSLogprint 的性能更好,后面会演示OC 对象// 实例化视图
let v = UIView(frame: CGRectMake(0, 0, 100, 100))
// 设置背景颜色
v.backgroundColor = UIColor.redColor()
// 添加到根视图
view.addSubview(v)
Swift 中要实例化一个对象可以使用 类名() 的格式,与 OC 中的 alloc/init 等价OC 中的 initWithXXX 在 Swift 中通常可以使用 类名(XXX: ) 找到对应的函数OC 中的 [UIColor redColor] 类方法,在 Swift 中通常可以使用 类名.XXX 找到对应的函数let 修饰 v 并且赋值,表示 该常量的内存地址不允许修改,但是可以修改其内部的属性self.常量&变量的使用原则:尽量先用 let,只有需要变的时候,再用 var,能够更加安全
let x = 10
let y = 10.5
let z: Double = 20
print(Double(x) + y)
print(x + Int(y))
print(y + z)
Swift 中会因为简单的 var let 误以为 Swift 中的类型非常松散Swift 是对类型要求非常严格的一门语言,一个值永远不会被自动转换成其他类型Double 类型Int 类型var 变量名: 类型 = 值var i = 10
if i > 0 {
print("OK")
}
Swift 中没有 C 语言中的非零即真概念if 语句条件的 () 可以省略{} 不能省略var a = 10
var b = 50
var result = a > b ? a : b
print(result)
Swift 中的 三目 运算保持了和 OC 一致的风格let url = NSURL(string: "http://www.baidu.com/?word=iphone")
if url != nil {
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data, encoding: NSUTF8StringEncoding))
}).resume()
}
阶段性小结
Swift 中,不是所有的对象实例化方法都会返回值,在实际开发中需要注意实例化函数的返回类型,例如:“`swift
convenience init?(string URLString: String)
* 如果有 `?` 表示改方法有可能无法实例化到正确的对象
* 这种函数返回的对象,被称为 `可选项`,即有可能有值,也有可能没有值
* 实际开发时,需要针对这种对象加以判断,并且在分支内部使用 `!`,指明改对象确实是存在的
* 相比在 `OC` 的开发,尤其在日常练习时,会给定一个能够运行的值,而在实际运行时,一旦条件不满足,会直接闪退,这样用户体验会非常不好
> `Swift` 的设计者考虑到因为对类型的强制要求,会让代码很难看,因此提供了一个变通的解决方案
### 演练 2
```swift
if let let url = NSURL(string: "http://www.baidu.com/?word=iphone") {
NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data, encoding: NSUTF8StringEncoding))
}).resume()
}
<div class="se-preview-section-delimiter"></div>
阶段性小结
if let 常量 = 可选构造函数 的方式能够确保分支内部常量一定是有值的!Swift 代码中的一个非常重要的使用技巧提示
Swift 提供了类型校验的手段,但是要写出 优雅 的 Swift 代码,还是需要多加练习的,否则一不小心就会出现分支嵌套层次很深的代码? 和 ! 的选择,可以借助 Xcode 的辅助工具,但是强烈建议每次遇到提示时,要多加思考,反复揣摩var name: String?
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
name = "zhangsan"
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
let l = 10
print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0))
<div class="se-preview-section-delimiter"></div>
?? 是一个非常有用的操作符,能够快速对 nil 进行判断nil,则使用 ?? 后面的值代替前面的 nil 值参与计算?? 时,整个部分需要使用 () 包装UITableView 的数据源方法中尤为重要for// 传统写法
for var i = 0; i < 10; i++ {
print(i)
}
<div class="se-preview-section-delimiter"></div>
for// 遍历 0 ~ <10
for i in 0..<10 {
print(i)
}
print("---")
// 遍历 0 ~ 10
for i in 0...10 {
print(i)
}
<div class="se-preview-section-delimiter"></div>
Swift 中使用 in 关键字标示循环的范围0..<10 表示从0到90...10 表示从0到10for _ in 0...10 {
print("hello")
}
<div class="se-preview-section-delimiter"></div>
_ 忽略在 Swift 中绝大多数的情况下,推荐使用 String 类型
String 的原因String 是一个结构体,性能更高 String 目前具有了绝大多数 NSString 的功能String 支持直接遍历NSString 是一个 OC 对象,性能略差Swift 提供了 String 和 NSString 之间的无缝转换let str = "我要飞的更High"
for s in str {
print(s)
}
<div class="se-preview-section-delimiter"></div>
let str1 = "zhangsan"
let str2 = "lisi"
let i = 10
print(str1 + str2)
print("\(str1) \(str2) \(i)")
<div class="se-preview-section-delimiter"></div>
"" 中使用 \(变量名) 的方式可以快速拼接字符串stringWithFormat 了 :Dfor _ in 0...10 {
let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])
print(str)
}
<div class="se-preview-section-delimiter"></div>
String(format:...) 的方式以下是超级费劲的代码
let str: String = "我要飞的更High"
var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex))
print(subStr)
subStr = str.substringWithRange(Range<String.Index>(start: advance(str.startIndex, 0), end: advance(str.startIndex, 3)))
print(subStr)
<div class="se-preview-section-delimiter"></div>
let str1: NSString = "我要飞的更High"
print(str1.substringWithRange(NSMakeRange(0, 3)))
<div class="se-preview-section-delimiter"></div>
let arr = ["zhangsan", "lisi"]
print(arr)
// 遍历每一个元素
for a in arr {
print(a)
}
// 像 OC 一样打印
print(arr as NSArray)
<div class="se-preview-section-delimiter"></div>
// 数组中保存的都是字符串
let arr = ["zhangsan", "lisi"]
// 数组中保存的是 NSObject
let arr1 = ["zhangsan", 1]
<div class="se-preview-section-delimiter"></div>
NSObject// 定义只能保存字符串类型数组
var array: [String]
// 初始化数组
array = ["zhangsan"]
// 添加元素
array.append("lisi")
print(array)
// 删除元素
array.removeAtIndex(1)
print(array)
// 删除所有元素
array.removeAll(keepCapacity: true)
print(array.capacity)
// 注意数组容量的变化
for i in 0..<10 {
array.append("\(i)")
print("\(array) --- \(array.capacity)")
}
// 实例化新的数组
var array2 = [String]()
array2.append("1")
array2.append("2")
// 拼接数组
array += array2
print(array)
<div class="se-preview-section-delimiter"></div>
[String]()let 定义的数组是不可变的var 定义的数组是可变的/// 定义并实例化字典
var dict = [String: AnyObject]()
dict["name"] = "zhangsan"
dict["age"] = 18
print(dict)
// 设置相同 key,之前的数值会被覆盖
dict["name"] = "lisi"
print(dict)
// 删除某一个 key
dict.removeValueForKey("age")
print(dict)
dict["title"] = "manager"
print(dict)
// 遍历字典(k, v可以随便写)
for (k, v) in dict {
print("\(k) -- \(v)")
}
// 合并字典
var dict2 = ["name": "wangwu", "age": 80, "title": "boss"]
for (k, v) in dict2 {
dict.updateValue(v, forKey: k)
}
print(dict)
<div class="se-preview-section-delimiter"></div>
func sum(a: Int, b: Int) -> Int {
return a + b
}
<div class="se-preview-section-delimiter"></div>
func 函数名(参数: 参数类型...) -> 返回值 { // 代码实现 }-> 返回值 可以省略-> 是一个很有意思的符号func sum1(x a: Int, y b: Int) -> Int {
return a + b
}
<div class="se-preview-section-delimiter"></div>
func sum2(a: Int, _ b: Int) -> Int {
return a + b
}
<div class="se-preview-section-delimiter"></div>
weak var weakSelf = self
demo("zhangsan") { (_) -> Int in
print(weakSelf?.view.backgroundColor)
return 20
}
<div class="se-preview-section-delimiter"></div>
lazy var demoView: UIView = {
let v = UIView(frame: CGRectMake(10, 10, 100, 100))
v.backgroundColor = UIColor.redColor()
return v
}()
<div class="se-preview-section-delimiter"></div>
lazy var 变量: 类型 = { 创建变量代码 }()
<div class="se-preview-section-delimiter"></div>
class Person: NSObject {
var name: String?
var age: Int?
}
<div class="se-preview-section-delimiter"></div>
var _name: String?
var name: String? {
get {
return _name
}
set {
_name = newValue
}
}
<div class="se-preview-section-delimiter"></div>
Swift 中以上形式的 getter & setter 很少用var length: Int? {
didSet {
timeStr = String(format: "%02d:%02d:%02d", arguments: [length! / 3600, (length! % 3600) / 60, length! % 60])
}
}
var timeStr: String?
<div class="se-preview-section-delimiter"></div>
var title: String {
get {
return "Mr " + (name ?? "")
}
}
<div class="se-preview-section-delimiter"></div>
getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性var title: String {
return "Mr " + (name ?? "")
}
<div class="se-preview-section-delimiter"></div>
init(dict: [NSObject: AnyObject]) {
name = dict["name"] as? String
age = dict["age"] as? Int
}
<div class="se-preview-section-delimiter"></div>
deinit {
print("88")
}
<div class="se-preview-section-delimiter"></div>
App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.
If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<div class="se-preview-section-delimiter"></div>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>原文地址:http://blog.csdn.net/jiahao8915/article/details/48031341