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 中的 NSLog
print
的性能更好,后面会演示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