api使用示例 swift4
2018-01-11 22:27:00 weixin_33827731 阅读数 4

String在Swift 4 的新特性深受大众喜爱(至少我是很喜欢的).
String API 在Swift 4 中有很多的改变.
具体改变请 参考链接.

下面说一些主要的变化.

直接上代码:

let galaxy = "Milky Way 🐮"
for char in galaxy {
  print(char)
}

Look! 不需要像Swift3 那样需要遍历galaxy.characters这个数组,直接就可以遍历每个字符,是不是很爽? Swift 4 is swifter than swift 3~ 哈哈.

继续,

galaxy.count       // 11
galaxy.isEmpty     // false
galaxy.dropFirst() // "ilky Way 🐮"
String(galaxy.reversed()) // "🐮 yaW ykliM"

从上面的代码我们可以看出,Swift4的String,具备了SequenceCollection的所有性质.

继续,

// Filter out any none ASCII characters
galaxy.filter { char in
  let isASCII = char.unicodeScalars.reduce(true, { $0 && $1.isASCII })
  return isASCII
} // "Milky Way "

这个是Swift4 String过滤非ASCII码的字符的方法. 和Swift 3 不同的是,它可以直接获取StringUnicodeScalarView, 而在之前,这是很繁琐的,你需要重新创建一个String,具体请参考链接.

// Grab a subsequence of String
let endIndex = galaxy.index(galaxy.startIndex, offsetBy: 3)
var milkSubstring = galaxy[galaxy.startIndex...endIndex]   // "Milk"
type(of: milkSubstring)   // Substring.Type

// Concatenate a String onto a Substring
milkSubstring += "🥛"     // "Milk🥛"

// Create a String from a Substring
let milkString = String(milkSubstring) // "Milk🥛"

上面的例子是Swift 4 的字符串Slice. 切割后的Substring和string 几乎是一样的,都遵守了StringProtocol,而StringProtocol是Swift 4 新加入的一个字符串协议.
详情请参考官方文档.

貌似Swift 4 对Emoji String 也有一些改变,有知道的朋友可以在下面留言讨论一下,感谢🙏.,让我们在交流中一起成长.

2017-06-12 14:09:03 weixin_34248705 阅读数 5

原文:Exploring the new String API in Swift 4 — Swift by Sundell

WWDC 已经结束了(我觉得是自 2014 年来最好的一场 WWDC),同时 Xcode 9 beta 版也发布了,很多开发者已经开始把玩 Swift 4 ,今年的新版本真心不错,这是一个改进版本而不是重构版本(像 Swift 2 和 3),因此大多数代码升级起来会更容易。

其中一个改进是 String 的 API,在 Swift 4 中更易用,也更强大。在过去的 Swift 版本中,String API 经常被提出为一个例子用来说明正确性,以繁琐的方式处理字符和子串。

本周,我们来看看在 Swift 4 中如何使用 String,以及如何在各种情况下利用新的改进的 API。

多行字符串

有时我们的应用或脚本中有很长的静态字符串会跨越多行。在 Swift 4之前,我们只能在字符串之间插入 \n 来换行,appendOnNewLine() 通过给 String 添加一个 extension 方法,多次 print() 来添加换行符用来大段文本输出。

译者注:这里的脚本指的是命令行程序

比如,下面是 TestDriveprintHelp() 方法(用于打印脚本的使用说明)在 Swift 3 看起来如下:

func printHelp() {
    print("🚘  Test Drive")
    print("--------------")
    print("Quickly try out any Swift pod or framework in a playground.")
    print("\nUsage:")
    print("- Simply pass a list of pod names or URLs that you want to test drive.")
    print("- You can also specify a platform (iOS, macOS or tvOS) using the '-p' option")
    print("- To use a specific version or branch, use the '-v' argument (or '-m' for master)")
    print("\nExamples:")
    print("- testdrive Unbox Wrap Files")
    print("- testdrive https://github.com/johnsundell/unbox.git Wrap Files")
    print("- testdrive Unbox -p tvOS")
    print("- testdrive Unbox -v 2.3.0")
    print("- testdrive Unbox -v swift3")
}复制代码

Swift 4 中处理多行文本字符串:

func printHelp() {
    print(
        """
        🚘  Test Drive
        --------------
        Quickly try out any Swift pod or framework in a playground.

        Usage:
        - Simply pass a list of pod names or URLs that you want to test drive.
        - You can also specify a platform (iOS, macOS or tvOS) using the '-p' option
        - To use a specific version or branch, use the '-v' argument (or '-m' for master)

        Examples:
        - testdrive Unbox Wrap Files
        - testdrive https://github.com/johnsundell/unbox.git Wrap Files
        - testdrive Unbox -p tvOS
        - testdrive Unbox -v 2.3.0
        - testdrive Unbox -v swift3
        """
    )
}复制代码

如上所示,当使用多行文本字符串时,代码会表示得更加清楚和整洁,我们不需要再添加很多 \n 换行符,而是简单地在字符串中添加真正的换行符,使得在运行脚本之前,可以很容易地看到输出后的样子。

在缩进方面,多行文本字符串使用底部""" 来确定字符串的基础缩进,所以跟这些引号对齐的所有内容都不会在字符串中进行额外的真实缩进。

字符串是集合(再次)

在 Swift 1 中,String 遵循了 CollectionType (Swift 3+ 中的 Collection)协议,这意味着您可以对它们执行各种收集操作(比如 forEach()filter() 等)。 您仍然可以在 Swift 2 & 3 中进行此操作,通过访问 characters 属性,但这很快会导致阅读代码更难。

Swift 4 中字符串再次成为了集合对象,这意味着你可以简单地将它们视为“字符集合”。这可能会很有用,比如从字符串中过滤出某些字符(让我们以叹号为例):

let filtered = string.filter { $0 != "!" }复制代码

新的 Substring 类型

Swift 4 引入了一种处理子字符串的新方法,使用了一个完全不同的类型 Substring 。现在大多数方法都会返回 Substring(如 split()),并且还引入了一个新的 subscripting API,让你可以快速访问一个子字符串:

// 从一个置顶的
let substring = string[index...]复制代码

我们来看一个例子,我们截断用户输入的文本返回一个子字符串,将其限制在一定长度。在 Swift 3 中,你会写成这样:

extension String {
    func truncated() -> String {
        return String(characters.prefix(truncationLimit))
    }
}复制代码

(编辑注释:我之前用的是一个更复杂的例子,感谢 Ole Begemann 指出这个更好的解决方案)

好消息是,由于 Swift 4 代码大多数兼容 Swift 3,所以上述代码同样可以在 Swift 4 下运行。但更好的消息是,由于 String 在 Swift 4 中是集合类型,我们可以直接简化上述代码为:

extension String {
    func truncated() -> Substring {
        return prefix(truncationLimit)
    }
}复制代码

上面用 prefix() 方法返回最多为 n 个元素的子序列,同时包括边界检查(如果我们的集合(这里是字符串)包含少于 n 个元素的时候,以防我们不会遇到错误)。

你可以看到上面的 truncated() 方法的返回类型现在是新的 Substring 类型。虽然起初看起来很累赘因为字符串现是一个不同的类型,但它在内存可预测性方面给了我们很大的优势。

为了避免创建许多冗余拷贝,Swift 字符串使用 “copy on write” 方式只需要在需要时进行拷贝。这意味着子字符串通常与内存中的父字符串共享相同的底层缓冲区。但是在 truncated() 这个例子中,我们不想在内存中保留整个未截断的字符串,只是为了能够使用截断的子字符串。

通过给我们一个 Substring 类型,而不是一个完整的 String,Swift 现在 “强制” 我们在需要时显式拷贝副本,让父字符串的内存可以被释放。我们可以简单地从截取的子字符串创建一个新的 String ,如下所示:

label.text = String(userInput.truncated())复制代码

结论

由于几乎所有的 Swift 应用和脚本都会处理字符串,所以很高兴能看到这些 API 的改进。我认为新的 API 是在正确性和易用性之间的一个很好的权衡,同时也要求程序员在 copy 时慎重选择,像 Substring 一样。

我没有在这篇文章中介绍的字符串 API 也有更多的进步,比如 Unicode 9 支持更简单的字符管理,并且能够轻松访问构成字符的底层 Unicode 代码。

我们将在即将发布的后续文章包括 WWDC 中发布的其他新的 Swift 4 API 、框架、工具中深入研究字符串处理和编码。敬请关注!😉

如何在 Swift 4 中找到新的 String API?String 现在是集合类型真的会让你的字符串处理更简单吗?如果你有类似问题或其他问题请让我知道,意见或反馈可以在这里评论或 Twitter @johnsundell

感谢阅读!🚀

2017-06-12 22:10:00 weixin_34043301 阅读数 5

原文:[Exploring the new String API in Swift 4](Exploring the new String API in Swift 4 — Swift by Sundell)

WWDC 已经结束了(我觉得是自 2014 年来最好的一场 WWDC),同时 Xcode 9 beta 版也发布了,很多开发者已经开始把玩 Swift 4 ,今年的新版本真心不错,这是一个改进版本而不是重构版本(像 Swift 2 和 3),因此大多数代码升级起来会更容易。

其中一个改进是 String 的 API,在 Swift 4 中更易用,也更强大。在过去的 Swift 版本中,String API 经常被提出为一个例子用来说明正确性,以繁琐的方式处理字符和子串。

本周,我们来看看在 Swift 4 中如何使用 String,以及如何在各种情况下利用新的改进的 API。

多行字符串

有时我们的应用或脚本中有很长的静态字符串会跨越多行。在 Swift 4之前,我们只能在字符串之间插入 \n 来换行,appendOnNewLine() 通过给 String 添加一个 extension 方法,多次 print() 来添加换行符用来大段文本输出。

译者注:这里的脚本指的是命令行程序

比如,下面是 TestDriveprintHelp() 方法(用于打印脚本的使用说明)在 Swift 3 看起来如下:

func printHelp() {
    print("🚘  Test Drive")
    print("--------------")
    print("Quickly try out any Swift pod or framework in a playground.")
    print("\nUsage:")
    print("- Simply pass a list of pod names or URLs that you want to test drive.")
    print("- You can also specify a platform (iOS, macOS or tvOS) using the '-p' option")
    print("- To use a specific version or branch, use the '-v' argument (or '-m' for master)")
    print("\nExamples:")
    print("- testdrive Unbox Wrap Files")
    print("- testdrive https://github.com/johnsundell/unbox.git Wrap Files")
    print("- testdrive Unbox -p tvOS")
    print("- testdrive Unbox -v 2.3.0")
    print("- testdrive Unbox -v swift3")
}

Swift 4 中处理多行文本字符串:

func printHelp() {
    print(
        """
        🚘  Test Drive
        --------------
        Quickly try out any Swift pod or framework in a playground.

        Usage:
        - Simply pass a list of pod names or URLs that you want to test drive.
        - You can also specify a platform (iOS, macOS or tvOS) using the '-p' option
        - To use a specific version or branch, use the '-v' argument (or '-m' for master)

        Examples:
        - testdrive Unbox Wrap Files
        - testdrive https://github.com/johnsundell/unbox.git Wrap Files
        - testdrive Unbox -p tvOS
        - testdrive Unbox -v 2.3.0
        - testdrive Unbox -v swift3
        """
    )
}

如上所示,当使用多行文本字符串时,代码会表示得更加清楚和整洁,我们不需要再添加很多 \n 换行符,而是简单地在字符串中添加真正的换行符,使得在运行脚本之前,可以很容易地看到输出后的样子。

在缩进方面,多行文本字符串使用底部""" 来确定字符串的基础缩进,所以跟这些引号对齐的所有内容都不会在字符串中进行额外的真实缩进。

字符串是集合(再次)

在 Swift 1 中,String 遵循了 CollectionType (Swift 3+ 中的 Collection)协议,这意味着您可以对它们执行各种收集操作(比如 forEach()filter() 等)。 您仍然可以在 Swift 2 & 3 中进行此操作,通过访问 characters 属性,但这很快会导致阅读代码更难。

Swift 4 中字符串再次成为了集合对象,这意味着你可以简单地将它们视为“字符集合”。这可能会很有用,比如从字符串中过滤出某些字符(让我们以叹号为例):

let filtered = string.filter { $0 != "!" }

新的 Substring 类型

Swift 4 引入了一种处理子字符串的新方法,使用了一个完全不同的类型 Substring 。现在大多数方法都会返回 Substring(如 split()),并且还引入了一个新的 subscripting API,让你可以快速访问一个子字符串:

// 从一个置顶的
let substring = string[index...]

我们来看一个例子,我们截断用户输入的文本返回一个子字符串,将其限制在一定长度。在 Swift 3 中,你会写成这样:

extension String {
    func truncated() -> String {
        return String(characters.prefix(truncationLimit))
    }
}

(编辑注释:我之前用的是一个更复杂的例子,感谢 Ole Begemann 指出这个更好的解决方案)

好消息是,由于 Swift 4 代码大多数兼容 Swift 3,所以上述代码同样可以在 Swift 4 下运行。但更好的消息是,由于 String 在 Swift 4 中是集合类型,我们可以直接简化上述代码为:

extension String {
    func truncated() -> Substring {
        return prefix(truncationLimit)
    }
}

上面用 prefix() 方法返回最多为 n 个元素的子序列,同时包括边界检查(如果我们的集合(这里是字符串)包含少于 n 个元素的时候,以防我们不会遇到错误)。

你可以看到上面的 truncated() 方法的返回类型现在是新的 Substring 类型。虽然起初看起来很累赘因为字符串现是一个不同的类型,但它在内存可预测性方面给了我们很大的优势。

为了避免创建许多冗余拷贝,Swift 字符串使用 “copy on write” 方式只需要在需要时进行拷贝。这意味着子字符串通常与内存中的父字符串共享相同的底层缓冲区。但是在 truncated() 这个例子中,我们不想在内存中保留整个未截断的字符串,只是为了能够使用截断的子字符串。

通过给我们一个 Substring 类型,而不是一个完整的 String,Swift 现在 “强制” 我们在需要时显式拷贝副本,让父字符串的内存可以被释放。我们可以简单地从截取的子字符串创建一个新的 String ,如下所示:

label.text = String(userInput.truncated())

结论

由于几乎所有的 Swift 应用和脚本都会处理字符串,所以很高兴能看到这些 API 的改进。我认为新的 API 是在正确性和易用性之间的一个很好的权衡,同时也要求程序员在 copy 时慎重选择,像 Substring 一样。

我没有在这篇文章中介绍的字符串 API 也有更多的进步,比如 Unicode 9 支持更简单的字符管理,并且能够轻松访问构成字符的底层 Unicode 代码。

我们将在即将发布的后续文章包括 WWDC 中发布的其他新的 Swift 4 API 、框架、工具中深入研究字符串处理和编码。敬请关注!😉

如何在 Swift 4 中找到新的 String API?String 现在是集合类型真的会让你的字符串处理更简单吗?如果你有类似问题或其他问题请让我知道,意见或反馈可以在这里评论或 Twitter @johnsundell

感谢阅读!🚀

2018-05-12 09:59:53 weixin_40515816 阅读数 141

本篇博客介绍如何用swift4去调用REST API。

环境:xode9.3 swift4 mac10.13.14

如果你想测试,可以用REST API数据测试网站

如果你想下载可以运行的例子点击这里:very simple demo ^^

xok,进入正题。

  1. 创建User数据结构:特别注意properties(userid,id,title)要和json数据一一对应。
struct User: Codable {
    let userId: Int
    let id: Int
    let title: String
}

   2. 用URLSesson取得数据

override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "REST API"

        //实现 URLSession
        let urlString = "https://jsonplaceholder.typicode.com/albums"
        guard let url = URL(string: urlString) else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error!.localizedDescription)
            }
            
            guard let data = data else { return }//获取数据
            
        }.resume()
        //结束实现 URLSession
    }
  3. 用JsonDecoder转换Data成自己的Model 
    override func viewDidLoad() {
        super.viewDidLoad()
        let urlString = "https://jsonplaceholder.typicode.com/albums"
        guard let url = URL(string: urlString) else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error!.localizedDescription)
            }
            
            guard let data = data else { return }
            //实现 JSON decoding and parsing
            do {
                //Decode 
                let userData= try JSONDecoder().decode([User].self, from: data)
                print(userData)
                //Get back to the main queue
                DispatchQueue.main.async {
                   //update UI
                }
                
            } catch let jsonError {
                print(jsonError)
            }
            
            
            }.resume()
    }

2018-05-13 23:36:20 kuangdacaikuang 阅读数 688

1.swift特色

  • swift取消了预编译指令包括宏
  • 提供了类似Java的命名空间,泛型,运算对象重载
  • 对foundation框架做了重载,将其绝大部分class转换为struct
  • swift是弱语言,不会对类型做隐式转换,不同类型之间不能直接运算,需要手动转换
  • 变量和常量类型不给定,会根据赋值情况自动推导
  • 不存在基本的数据类型,Int,Double,CGFloat等都是结构体

2.资源

3.差异

  • 访问当前属性不用谢self. 闭包中访问需要使用self.
  • 基本不用;分割语句
  • 枚举类型不用写全名,直接.类型(UIButtonTypeContactAdd —> .contactAdd)
  • target - action的变化: @selector(buttonClick:) –> #selector(buttonClick(_ :))
  • 标记提示: //MARK: //TODO: //FIXME: //
  • if条件语句可以不适用()

4.可选项optional

let x: Optional = 10
let x: Int? = 10
print(x) 结果都是 optional(10)
  • 可选项不能直接参与计算
  • optional可能有值,可能没值
  • !可以进行强行解包,没有值得时候,强行解包是出错的

5.可选项处理if let和guard let和??

let name:String?
let age:Int?

//方法1: 可以连续判断
// if var 连用可以修改{变量的值,新变量的作用域仅仅在{}内起作用}
if let name = name, let age = age {
    print(name + String(age))
}

//方法2: 可以连续判断
guard let name = name, let age = age else {return}
print(name + String(age))

//方法3
print(name ?? "" + String(age))

函数调用

override func viewDidLoad {
    getUserInfo("iOS",25)
}

fun getUserInfo(_ name:String?, _ age:Int?) -> () {
    //使用同名的变量接收值,后面使用的值是非控制,不用考虑解包的问题和变量起名的问题,if let 只在{}内有效,guard let只在后面有效
    guard let name = name, let age = age else {return}
    print(name + String(age))
}

解析json的好处

//省去了复杂的if else 的判断
if let jsonDic = json as? NSDictionary,
    let menu = jsonDic["menu"] as? [String: Any],
    let popup = menu["popup"],
    let popupDic = popup as? [String: Any],
    let menuItems = popupDic["menuitem"],
    let menuItemsArr = menuItems as? [Any],
    let item0 = menuItemsArr[0] as? [String: Any],
    let value = item0["value"]
{
    print(value)
}

6.for循环

let range1 = 0..<10
let rang2 = 0...10
//0..<10 代表[0.10)
for i in 0..<10 {
    print(i)
}
//0...10 代表[0.10]
for i in 0...10 {
    print(i)
}
//反转
for i in (0...10).reversed {
    print(i)
}
//数组输出
for i in arr {
    print(i)
}
//数组输出
for (index,value) in arr.enumerated() {
    print(index)
    print(value)
}

7.switch语句case值变化

  • switch可以对任意类型的值进行分支判断
  • 一般不适用break
  • 不在使用多个case的穿透作用,而是使用case “a”,”b” :进行判断
  • 可以使用where筛选语句
var value:(Int,String) = (1,"小明")
switch value {
case let (x,y) where x < 60:
    print("不及格")
default:
    print("及格")
}

8.字符长度,拼接,格式化

let str = "hello word 中国"
//字符串长度,返回字符的个数
print(str.count)
//返回指定编码对应的字节数量 utf8编码(0~4)个,每个汉字是3个字节
print(str.lengthOfBytes(using: .utf8))

let name = "中国"
let age = 65
let rank:String? = "第二名"
let descStr = "\(name)\(age)\(rank ?? "")"

let hh = 12
let mm = 3
let ss = 45

let time = String(format:"%2d:%2d:%2d",hh,mm,ss)

9.数组

//可变数组用var修饰,let修饰不可变数组

//同类数据类型
let arr = [1,2,3] ---> [Int]
//不同类类型
let arr2 = ["avc",1]  ---> [AnyObject]
//其他写法
let arr3 = [Int]()

let arr = [1,2,3]
print(arr)

//下标
for i in 0..<arr.count {
    print(arr[i])
}
//for in
for item in arr {
    print(item)
}
//block
for (index,value) in arr.enumerated() {
    print(index,value)
}
//元组 let e: (offset: Int, element: Int)
for e in arr.enumerated() {
    print("\(e.offset)--\(e.element)")
}
//反向遍历--先枚举在遍历
for e in arr.enumerated().reversed() {
    print("\(e.offset)--\(e.element)")
}

//添加
arr.append(4)
arr[5] = 5

//删除
![这里写图片描述](https://img-blog.csdn.net/20180515003026584?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1YW5nZGFjYWlrdWFuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

//数组合并: 元素必须是同类型才能合并
let view = UIView()
let arr1:[Any] = ["avc",1,view] --> [NSObject]
let arr2:[Any] = [1,3,2]
arr1 + arr2

10.字典

//可变用var修饰,let修饰不可变
//字典中的key必须是唯一的

//let dict: [String : Any]
let dict = ["name":"中古","age":14] as [String : Any]

//let arr: [[String : Any]]
let arr = [
    ["name":"张三","age":14],
    ["name":"李四","age":15]
]

//最常用的类型
//let jsonArr: [[String : Any]]
let jsonArr: [[String: Any]] =  [
    ["name":"张三","age":14],
    ["name":"李四","age":15]
]

//元组遍历
for item in dict (
    print(item.key,item.value)
)
//key,value
for (key,value) in dict (
    print(key,value)
)
//注意
dict1 + dict2是不合法的,只能遍历一个往另一个中添加

[译] 探索 Swift 4 中新的 String API

阅读数 3

本文讲的是[译]探索Swift4中新的StringAPI,WWDC已经结束了(我觉得是自2014年来最好的一场WWDC),同时Xcode9beta版也发布了,很多开发者已经开始把玩Swift4,今年的新版本真心不错,这是一个改进版本而不是重构版本(像Swift2和3),因此大多数代码升级起来会更容易。其中...

博文 来自: weixin_34194379

Swift 4 Date相关的使用

阅读数 76

一、基本操作1、获取一个当前的日期lettoday=Date()print(today)//输出结果:2019-02-2713:02:40+0000系统当前取的是零时区的时间,我们所在的是东八区,所以会与实际的时间相差八个小时2、Date转StringletdateFormatter=DateFormatter()dateFormatter.dat...

博文 来自: u010545480

4、Swift中UIButton的使用

阅读数 992

1、创建一个按钮对象,如下代码所示:letbtn=UIButton(type:UIButtonType.System);其中UIButtonType还有以下几种类型,如下说明以及运行效果图://Custom  //表示没有按钮类型,如果使用此类型,字体颜色为白色,如果在白色背景下是看不到该按钮的//System  //使用系统的标准按钮

博文 来自: sunxiaoju

Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4) - 2.互通性

阅读数 7

章节导航:Swift开发指南:使用Swift与Cocoa和Objective-C(Swift4)-1.入门Swift开发指南:使用Swift与Cocoa和Objective-C(Swift4)-2.互通性与Objective-CAPI进行交互互操作性是能够在任何一个方向上与Swift和Objective-C进行接口,让您访问并使用以...

博文 来自: weixin_33922670

Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4) - 2.互通性

阅读数 617

章节导航:Swift开发指南:使用Swift与Cocoa和Objective-C(Swift4)-1.入门与Objective-CAPI进行交互互操作性是能够在任何一个方向上与Swift和Objective-C进行接口,让您访问并使用以其他语言的文件中的一些代码。当您开始将Swift集成到应用程序开发工作流程中时,了解如何利用互操作性来重新定义、改进和增强编写Cocoa应用程序的方式是一

博文 来自: b735098742
没有更多推荐了,返回首页