Swift4.0
中
String
的
Optional
在
String
作为
urlString
去初始化
url
并进行网络访问时,会出现
url
为
Optional
包
string
的错误情况
如:在
AFNetwork3.1
的
get
请求中使用
Optional
类型的
String
时,会有如下错误:
//NSErrorFailingURLStringKey=Optional( http://api.test.com/api/getcommon.php)?bundleId=com.dddd
所以要避免
urlString
为
Optional
类型
将
String
类型转为
Optional String
类型为
封包
将
Optional String
类型强制转换为
String
类型
成为强制拆包
*/
//
封包
显式封包
let
urlStrOptional:
String
? =
" http://api.test.com/api/getcommon.php
"
;
print
(
"the urlStrOptional is
\
(
urlStrOptional
)"
)
//
输出为:
the urlStr is Optional(" http://api.test.com/api/getcommon.php
")
不能作为
urlString
去发送
url
请求
//
封包
隐式封包
//
此处需要注意虽然在定义
urlStr
时定义为非
Optional
类型但是
Swift4.0
在使用
'='
号
赋值时,左边的变量会被自动转换为
Optional
类型
(
称为隐式封包
)
//
这点是
Swift3.0
的一个特点
需要特别注意
!!!
let
urlStr:
String
! =
" http://api.test.com/api/getcommon.php
"
;
print
(
"the urlStr is
\
(
urlStr
)"
)
//
输出为:
the urlStr is Optional(" http://api.test.com/api/getcommon.php
")
不能作为
urlString
去发送
url
请求
//
强制拆包
//
当
String
被隐式封包时
如果要作为初始化
URL
的
String
时,必须要进行强制拆包,强制拆包为
在
Optional
类型的
String
参数后加上
'!'
号
//
上面的
urlStr
已经被隐式封包
此处进行强制拆包
//urlStrOptional!
和
urlStr!
可作为初始化
URL
的
String
因为
urlStrOptional!
和
urlStr!
进行了强制拆包
print
(
"the urlStrOptional is
\
(
urlStrOptional!
)"
)
print
(
"the urlStr is
\
(
urlStr!
)"
)
- //
- // ViewController.swift
- // test_swift4.0_Optional_01
-
-
- import UIKit
-
- class ViewController: UIViewController {
-
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view, typically from a nib.
- }
-
- override func touchesBegan(_ touches: Set, with event: UIEvent?) {
-
- /**
- Swift3.0中 String的 Optional在String作为urlString去初始化url并进行网络访问时,会出现url为Optional包string的错误情况
- 如:在AFNetwork3.1的get请求中使用Optional 类型的 String时,会有如下错误:
- //NSErrorFailingURLStringKey=Optional(http://api.test.com/api/getcommon.php)?bundleId=com.dddd
- 所以要避免urlString为Optional类型
- 将 String类型转为Optional String类型为 封包
- 将Optional String 类型强制转换为String类型 成为强制拆包
- */
-
- //封包 显式封包
- let urlStrOptional: String? = "http://api.test.com/api/getcommon.php";
- print("the urlStrOptional is \(urlStrOptional)")
- //输出为:the urlStr is Optional("http://api.test.com/api/getcommon.php") 不能作为urlString 去发送url请求
-
-
- //封包 隐式封包
- //此处需要注意虽然在定义urlStr时定义为非Optional类型但是Swift3.0在使用 '=' 号 赋值时,左边的变量会被自动转换为Optional类型(称为隐式封包)
- //这点是Swift4.0的一个特点 需要特别注意!!!
- let urlStr: String! = "http://api.test.com/api/getcommon.php";
- print("the urlStr is \(urlStr)")
- //输出为:the urlStr is Optional("http://api.test.com/api/getcommon.php") 不能作为urlString 去发送url请求
-
- //强制拆包
- //当String被隐式封包时 如果要作为初始化URL的String时,必须要进行强制拆包,强制拆包为 在Optional类型的String参数后加上 '!' 号
- //上面的 urlStr 已经被隐式封包 此处进行强制拆包
- //urlStrOptional! 和 urlStr! 可作为初始化URL的String 因为urlStrOptional! 和 urlStr!进行了强制拆包
- print("the urlStrOptional is \(urlStrOptional!)")
- print("the urlStr is \(urlStr!)")
-
-
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
-
-
- }