Error[8]: Undefined offset: 18, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。 基本语法

Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。

基本语法

先来看下面一段代码

func swap(chars:[Character], p: Int,q: Int) {  var temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(array,p: 0,q: 1)

上面代码实现了一个非常简单的功能,就是交换一个数组中的两个值。乍一看非常正确,实际上存在以下几个问题。

在第一个参数前应该加上 inout 关键字。因为在Swift中,struct都是按值传递,class是按引用传递;数组和字典都是struct。所以要改变原来的chars数组,在其前部加入inout关键字,表示是按引用传递。p 和 q 之前应该加入下划线。Swift默认函数的第一个参数是局部(local)变量,而后续参数都是外部(external)变量,外部变量必须声明。如果在p和q前加上下划线,则在调用函数时无需声明外部变量,这样调用起来更简便。temp前的var应该改为let。let用于声明常量(constant),var用于声明变量(variable)。swap函数中,temp并未进行修改,所以应当视为常量,用let来声明。

修改过后的代码为

func swap(inout chars:[Character], _ p: Int,_ q: Int) {  let temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(&array,1)

再来看一段代码

func toZero(x: Int) -> Int {  while x > 0 {    x -= 1  }  return x}

这里在 x -= 1 处会报错。原因是函数中所有的参数是常量(let),是不可以修改的。解决的方法是在函数中写上var x = x,之后就可以对 x 进行修改了

循环

Swift循环分为for和while两种,注意他们的结构跟传统的 Java,C/C++有很大区别,笔者将其总结如下

// Assume names is an array holds enough Strings// for loopfor name in names { }for i in 0 ... names.count - 1 { }for i in 0 ..< names.count { }for _ in 0 ..< names.count { }for name in names.reverse() { }for i in 0.strIDe(through: names.count - 1,by 2) { }for i in 0.strIDe(to: names.count,by: 2) { }// while loopvar i = 0while i < names.count { }repeat { } while i < names.count

以上代码非常简单。需要说明的有两个,一个是 for _ in 0 ..< names.count { } 。当我们不需要数组中每一个具体的元素值时,我们就可以用下划线来代表序号。
另一个是是 repeat { } while i < names.count 。这个相当于我们熟悉(java)的 do { } while (i < names.length)。

排序

swift排序效率很高,写法也很简洁。笔者将其总结如下

// Sort an Int array,ascendingnums.sortInPlace({
// Returns the index of the first occurrence of needle in haystack,// or -1 if needle is not part of haystackfunc strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  if hChars.count < nChars.count {    return -1  }  if hChars.count == 0 {    return -1  }  for i in 0 ... hChars.count - nChars.count {    if hChars[i] == nChars[0] {      for j in 0 ..< nChars.count {        if hChars[i + j] != nChars[j] {          break        } else {          if j == nChars.count - 1 {            return i          }        }      }    }  }    return -1}
< })// Sort an Int array without mutating the original one,ascendingvar sortednums = nums.sort({
func strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  guard hChars.count >= nChars.count else {    return -1  }  if nChars.count == 0 {    return 0  }  for i in 0 ... hChars.count - nChars.count {    guard hChars[i] == nChars[0] else {      continue    }    for j in 0 ..< nChars.count {      guard hChars[i + j] == nChars[j] else {        break      }      if j == nChars.count - 1 {        return i      }    }  }  return -1}
< })// Sort an array with custom-defined objects,ascendingtimeIntervals.sortInPlace({
文/故胤道长(简书作者)原文链接:http://www.jianshu.com/p/ee16bcf50a59
.startTime < .startTime})// Sort keys in a dictionary according to its value,ascendinglet keys = Array(dict.keys)var sortedKeys = keys.sort() {  let value0 = dict[微信号:iOSDevTip]  let value1 = dict[]  return value0 < value1}
活用Guard语句

使用Guard语句可以让逻辑变得非常清楚,尤其是在处理算法问题的时候,请看下面的代码

长按上图,d出“识别二维码”后关注

上面这段代码是求字符串needle在字符串haystack里首次出现的位置。我们发现for循环中的嵌套非常繁琐,但是如果使用Guard语句代码会变得清晰很多:

微信号:CodePush

Guard语句的好处是判断条件永远是我们希望的条件而不是特殊情况,且成功避免了大量的if嵌套。

另外在上面代码中,为何要将字符串转化成数组进行处理?因为Swift中没有方法能够以O(1)的时间复杂度取得字符串中的字符,我们常用的string.startIndex.advancedBy(n)方法,其时间复杂度为O(n)。所以笔者在这里以空间换时间的方法进行了优化。
总结

Swift是一门独特的语言,本文对其基本知识和语法进行了适当归纳,文中提到的都是基本细节。下期我们会讨论更加进阶的内容。

微信号:AndroIDPush

2016年最热门的公众号精选


iOS开发

「iOS开发」最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!


微信号:SwiftDev


猿圈

「猿圈」为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。


微信号:aswifter


AndroID开发精选

「AndroID开发精选」定期翻译、发布国内外AndroID优质的技术文章、开源库、软件架构设计、测试等,让我们的技术跟上国际步伐.


微信号:PythonPush



长按上图,d出“识别二维码”后关注

Swift开发

「Swift开发」探讨移动开发技术,推荐常用框架,分享移动互联网资讯。  主要提供Swift,IOS等相关技术资讯



[+++]


APP开发者

「APP开发者」分享IOS开发,Swift开发,AndroID 开发和互联网内容


[+++]


Python开发

「Python开发」人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。

[+++]


[+++]

总结

以上是内存溢出为你收集整理的Swift 算法实战之路:基本语法与技巧全部内容,希望文章能够帮你解决Swift 算法实战之路:基本语法与技巧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 19, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。 基本语法

Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。

基本语法

先来看下面一段代码

func swap(chars:[Character], p: Int,q: Int) {  var temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(array,p: 0,q: 1)

上面代码实现了一个非常简单的功能,就是交换一个数组中的两个值。乍一看非常正确,实际上存在以下几个问题。

在第一个参数前应该加上 inout 关键字。因为在Swift中,struct都是按值传递,class是按引用传递;数组和字典都是struct。所以要改变原来的chars数组,在其前部加入inout关键字,表示是按引用传递。p 和 q 之前应该加入下划线。Swift默认函数的第一个参数是局部(local)变量,而后续参数都是外部(external)变量,外部变量必须声明。如果在p和q前加上下划线,则在调用函数时无需声明外部变量,这样调用起来更简便。temp前的var应该改为let。let用于声明常量(constant),var用于声明变量(variable)。swap函数中,temp并未进行修改,所以应当视为常量,用let来声明。

修改过后的代码为

func swap(inout chars:[Character], _ p: Int,_ q: Int) {  let temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(&array,1)

再来看一段代码

func toZero(x: Int) -> Int {  while x > 0 {    x -= 1  }  return x}

这里在 x -= 1 处会报错。原因是函数中所有的参数是常量(let),是不可以修改的。解决的方法是在函数中写上var x = x,之后就可以对 x 进行修改了

循环

Swift循环分为for和while两种,注意他们的结构跟传统的 Java,C/C++有很大区别,笔者将其总结如下

// Assume names is an array holds enough Strings// for loopfor name in names { }for i in 0 ... names.count - 1 { }for i in 0 ..< names.count { }for _ in 0 ..< names.count { }for name in names.reverse() { }for i in 0.strIDe(through: names.count - 1,by 2) { }for i in 0.strIDe(to: names.count,by: 2) { }// while loopvar i = 0while i < names.count { }repeat { } while i < names.count

以上代码非常简单。需要说明的有两个,一个是 for _ in 0 ..< names.count { } 。当我们不需要数组中每一个具体的元素值时,我们就可以用下划线来代表序号。
另一个是是 repeat { } while i < names.count 。这个相当于我们熟悉(java)的 do { } while (i < names.length)。

排序

swift排序效率很高,写法也很简洁。笔者将其总结如下

// Sort an Int array,ascendingnums.sortInPlace({
// Returns the index of the first occurrence of needle in haystack,// or -1 if needle is not part of haystackfunc strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  if hChars.count < nChars.count {    return -1  }  if hChars.count == 0 {    return -1  }  for i in 0 ... hChars.count - nChars.count {    if hChars[i] == nChars[0] {      for j in 0 ..< nChars.count {        if hChars[i + j] != nChars[j] {          break        } else {          if j == nChars.count - 1 {            return i          }        }      }    }  }    return -1}
< })// Sort an Int array without mutating the original one,ascendingvar sortednums = nums.sort({
func strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  guard hChars.count >= nChars.count else {    return -1  }  if nChars.count == 0 {    return 0  }  for i in 0 ... hChars.count - nChars.count {    guard hChars[i] == nChars[0] else {      continue    }    for j in 0 ..< nChars.count {      guard hChars[i + j] == nChars[j] else {        break      }      if j == nChars.count - 1 {        return i      }    }  }  return -1}
< })// Sort an array with custom-defined objects,ascendingtimeIntervals.sortInPlace({
文/故胤道长(简书作者)原文链接:http://www.jianshu.com/p/ee16bcf50a59
.startTime < .startTime})// Sort keys in a dictionary according to its value,ascendinglet keys = Array(dict.keys)var sortedKeys = keys.sort() {  let value0 = dict[微信号:iOSDevTip]  let value1 = dict[]  return value0 < value1}
活用Guard语句

使用Guard语句可以让逻辑变得非常清楚,尤其是在处理算法问题的时候,请看下面的代码

长按上图,d出“识别二维码”后关注

上面这段代码是求字符串needle在字符串haystack里首次出现的位置。我们发现for循环中的嵌套非常繁琐,但是如果使用Guard语句代码会变得清晰很多:

微信号:CodePush

Guard语句的好处是判断条件永远是我们希望的条件而不是特殊情况,且成功避免了大量的if嵌套。

另外在上面代码中,为何要将字符串转化成数组进行处理?因为Swift中没有方法能够以O(1)的时间复杂度取得字符串中的字符,我们常用的string.startIndex.advancedBy(n)方法,其时间复杂度为O(n)。所以笔者在这里以空间换时间的方法进行了优化。
总结

Swift是一门独特的语言,本文对其基本知识和语法进行了适当归纳,文中提到的都是基本细节。下期我们会讨论更加进阶的内容。

微信号:AndroIDPush

2016年最热门的公众号精选


iOS开发

「iOS开发」最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!


微信号:SwiftDev


猿圈

「猿圈」为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。


微信号:aswifter


AndroID开发精选

「AndroID开发精选」定期翻译、发布国内外AndroID优质的技术文章、开源库、软件架构设计、测试等,让我们的技术跟上国际步伐.


微信号:PythonPush



长按上图,d出“识别二维码”后关注

Swift开发

「Swift开发」探讨移动开发技术,推荐常用框架,分享移动互联网资讯。  主要提供Swift,IOS等相关技术资讯




APP开发者

「APP开发者」分享IOS开发,Swift开发,AndroID 开发和互联网内容


[+++]


Python开发

「Python开发」人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。

[+++]


[+++]

总结

以上是内存溢出为你收集整理的Swift 算法实战之路:基本语法与技巧全部内容,希望文章能够帮你解决Swift 算法实战之路:基本语法与技巧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 20, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。 基本语法

Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。

基本语法

先来看下面一段代码

func swap(chars:[Character], p: Int,q: Int) {  var temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(array,p: 0,q: 1)

上面代码实现了一个非常简单的功能,就是交换一个数组中的两个值。乍一看非常正确,实际上存在以下几个问题。

在第一个参数前应该加上 inout 关键字。因为在Swift中,struct都是按值传递,class是按引用传递;数组和字典都是struct。所以要改变原来的chars数组,在其前部加入inout关键字,表示是按引用传递。p 和 q 之前应该加入下划线。Swift默认函数的第一个参数是局部(local)变量,而后续参数都是外部(external)变量,外部变量必须声明。如果在p和q前加上下划线,则在调用函数时无需声明外部变量,这样调用起来更简便。temp前的var应该改为let。let用于声明常量(constant),var用于声明变量(variable)。swap函数中,temp并未进行修改,所以应当视为常量,用let来声明。

修改过后的代码为

func swap(inout chars:[Character], _ p: Int,_ q: Int) {  let temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(&array,1)

再来看一段代码

func toZero(x: Int) -> Int {  while x > 0 {    x -= 1  }  return x}

这里在 x -= 1 处会报错。原因是函数中所有的参数是常量(let),是不可以修改的。解决的方法是在函数中写上var x = x,之后就可以对 x 进行修改了

循环

Swift循环分为for和while两种,注意他们的结构跟传统的 Java,C/C++有很大区别,笔者将其总结如下

// Assume names is an array holds enough Strings// for loopfor name in names { }for i in 0 ... names.count - 1 { }for i in 0 ..< names.count { }for _ in 0 ..< names.count { }for name in names.reverse() { }for i in 0.strIDe(through: names.count - 1,by 2) { }for i in 0.strIDe(to: names.count,by: 2) { }// while loopvar i = 0while i < names.count { }repeat { } while i < names.count

以上代码非常简单。需要说明的有两个,一个是 for _ in 0 ..< names.count { } 。当我们不需要数组中每一个具体的元素值时,我们就可以用下划线来代表序号。
另一个是是 repeat { } while i < names.count 。这个相当于我们熟悉(java)的 do { } while (i < names.length)。

排序

swift排序效率很高,写法也很简洁。笔者将其总结如下

// Sort an Int array,ascendingnums.sortInPlace({
// Returns the index of the first occurrence of needle in haystack,// or -1 if needle is not part of haystackfunc strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  if hChars.count < nChars.count {    return -1  }  if hChars.count == 0 {    return -1  }  for i in 0 ... hChars.count - nChars.count {    if hChars[i] == nChars[0] {      for j in 0 ..< nChars.count {        if hChars[i + j] != nChars[j] {          break        } else {          if j == nChars.count - 1 {            return i          }        }      }    }  }    return -1}
< })// Sort an Int array without mutating the original one,ascendingvar sortednums = nums.sort({
func strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  guard hChars.count >= nChars.count else {    return -1  }  if nChars.count == 0 {    return 0  }  for i in 0 ... hChars.count - nChars.count {    guard hChars[i] == nChars[0] else {      continue    }    for j in 0 ..< nChars.count {      guard hChars[i + j] == nChars[j] else {        break      }      if j == nChars.count - 1 {        return i      }    }  }  return -1}
< })// Sort an array with custom-defined objects,ascendingtimeIntervals.sortInPlace({
文/故胤道长(简书作者)原文链接:http://www.jianshu.com/p/ee16bcf50a59
.startTime < .startTime})// Sort keys in a dictionary according to its value,ascendinglet keys = Array(dict.keys)var sortedKeys = keys.sort() {  let value0 = dict[微信号:iOSDevTip]  let value1 = dict[]  return value0 < value1}
活用Guard语句

使用Guard语句可以让逻辑变得非常清楚,尤其是在处理算法问题的时候,请看下面的代码

长按上图,d出“识别二维码”后关注

上面这段代码是求字符串needle在字符串haystack里首次出现的位置。我们发现for循环中的嵌套非常繁琐,但是如果使用Guard语句代码会变得清晰很多:

微信号:CodePush

Guard语句的好处是判断条件永远是我们希望的条件而不是特殊情况,且成功避免了大量的if嵌套。

另外在上面代码中,为何要将字符串转化成数组进行处理?因为Swift中没有方法能够以O(1)的时间复杂度取得字符串中的字符,我们常用的string.startIndex.advancedBy(n)方法,其时间复杂度为O(n)。所以笔者在这里以空间换时间的方法进行了优化。
总结

Swift是一门独特的语言,本文对其基本知识和语法进行了适当归纳,文中提到的都是基本细节。下期我们会讨论更加进阶的内容。

微信号:AndroIDPush

2016年最热门的公众号精选


iOS开发

「iOS开发」最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!


微信号:SwiftDev


猿圈

「猿圈」为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。


微信号:aswifter


AndroID开发精选

「AndroID开发精选」定期翻译、发布国内外AndroID优质的技术文章、开源库、软件架构设计、测试等,让我们的技术跟上国际步伐.


微信号:PythonPush



长按上图,d出“识别二维码”后关注

Swift开发

「Swift开发」探讨移动开发技术,推荐常用框架,分享移动互联网资讯。  主要提供Swift,IOS等相关技术资讯




APP开发者

「APP开发者」分享IOS开发,Swift开发,AndroID 开发和互联网内容



Python开发

「Python开发」人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。

[+++]


[+++]

总结

以上是内存溢出为你收集整理的Swift 算法实战之路:基本语法与技巧全部内容,希望文章能够帮你解决Swift 算法实战之路:基本语法与技巧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 21, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。 基本语法

Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。

基本语法

先来看下面一段代码

func swap(chars:[Character], p: Int,q: Int) {  var temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(array,p: 0,q: 1)

上面代码实现了一个非常简单的功能,就是交换一个数组中的两个值。乍一看非常正确,实际上存在以下几个问题。

在第一个参数前应该加上 inout 关键字。因为在Swift中,struct都是按值传递,class是按引用传递;数组和字典都是struct。所以要改变原来的chars数组,在其前部加入inout关键字,表示是按引用传递。p 和 q 之前应该加入下划线。Swift默认函数的第一个参数是局部(local)变量,而后续参数都是外部(external)变量,外部变量必须声明。如果在p和q前加上下划线,则在调用函数时无需声明外部变量,这样调用起来更简便。temp前的var应该改为let。let用于声明常量(constant),var用于声明变量(variable)。swap函数中,temp并未进行修改,所以应当视为常量,用let来声明。

修改过后的代码为

func swap(inout chars:[Character], _ p: Int,_ q: Int) {  let temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(&array,1)

再来看一段代码

func toZero(x: Int) -> Int {  while x > 0 {    x -= 1  }  return x}

这里在 x -= 1 处会报错。原因是函数中所有的参数是常量(let),是不可以修改的。解决的方法是在函数中写上var x = x,之后就可以对 x 进行修改了

循环

Swift循环分为for和while两种,注意他们的结构跟传统的 Java,C/C++有很大区别,笔者将其总结如下

// Assume names is an array holds enough Strings// for loopfor name in names { }for i in 0 ... names.count - 1 { }for i in 0 ..< names.count { }for _ in 0 ..< names.count { }for name in names.reverse() { }for i in 0.strIDe(through: names.count - 1,by 2) { }for i in 0.strIDe(to: names.count,by: 2) { }// while loopvar i = 0while i < names.count { }repeat { } while i < names.count

以上代码非常简单。需要说明的有两个,一个是 for _ in 0 ..< names.count { } 。当我们不需要数组中每一个具体的元素值时,我们就可以用下划线来代表序号。
另一个是是 repeat { } while i < names.count 。这个相当于我们熟悉(java)的 do { } while (i < names.length)。

排序

swift排序效率很高,写法也很简洁。笔者将其总结如下

// Sort an Int array,ascendingnums.sortInPlace({
// Returns the index of the first occurrence of needle in haystack,// or -1 if needle is not part of haystackfunc strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  if hChars.count < nChars.count {    return -1  }  if hChars.count == 0 {    return -1  }  for i in 0 ... hChars.count - nChars.count {    if hChars[i] == nChars[0] {      for j in 0 ..< nChars.count {        if hChars[i + j] != nChars[j] {          break        } else {          if j == nChars.count - 1 {            return i          }        }      }    }  }    return -1}
< })// Sort an Int array without mutating the original one,ascendingvar sortednums = nums.sort({
func strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  guard hChars.count >= nChars.count else {    return -1  }  if nChars.count == 0 {    return 0  }  for i in 0 ... hChars.count - nChars.count {    guard hChars[i] == nChars[0] else {      continue    }    for j in 0 ..< nChars.count {      guard hChars[i + j] == nChars[j] else {        break      }      if j == nChars.count - 1 {        return i      }    }  }  return -1}
< })// Sort an array with custom-defined objects,ascendingtimeIntervals.sortInPlace({
文/故胤道长(简书作者)原文链接:http://www.jianshu.com/p/ee16bcf50a59
.startTime < .startTime})// Sort keys in a dictionary according to its value,ascendinglet keys = Array(dict.keys)var sortedKeys = keys.sort() {  let value0 = dict[微信号:iOSDevTip]  let value1 = dict[]  return value0 < value1}
活用Guard语句

使用Guard语句可以让逻辑变得非常清楚,尤其是在处理算法问题的时候,请看下面的代码

长按上图,d出“识别二维码”后关注

上面这段代码是求字符串needle在字符串haystack里首次出现的位置。我们发现for循环中的嵌套非常繁琐,但是如果使用Guard语句代码会变得清晰很多:

微信号:CodePush

Guard语句的好处是判断条件永远是我们希望的条件而不是特殊情况,且成功避免了大量的if嵌套。

另外在上面代码中,为何要将字符串转化成数组进行处理?因为Swift中没有方法能够以O(1)的时间复杂度取得字符串中的字符,我们常用的string.startIndex.advancedBy(n)方法,其时间复杂度为O(n)。所以笔者在这里以空间换时间的方法进行了优化。
总结

Swift是一门独特的语言,本文对其基本知识和语法进行了适当归纳,文中提到的都是基本细节。下期我们会讨论更加进阶的内容。

微信号:AndroIDPush

2016年最热门的公众号精选


iOS开发

「iOS开发」最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!


微信号:SwiftDev


猿圈

「猿圈」为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。


微信号:aswifter


AndroID开发精选

「AndroID开发精选」定期翻译、发布国内外AndroID优质的技术文章、开源库、软件架构设计、测试等,让我们的技术跟上国际步伐.


微信号:PythonPush



长按上图,d出“识别二维码”后关注

Swift开发

「Swift开发」探讨移动开发技术,推荐常用框架,分享移动互联网资讯。  主要提供Swift,IOS等相关技术资讯




APP开发者

「APP开发者」分享IOS开发,Swift开发,AndroID 开发和互联网内容



Python开发

「Python开发」人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。


[+++]

总结

以上是内存溢出为你收集整理的Swift 算法实战之路:基本语法与技巧全部内容,希望文章能够帮你解决Swift 算法实战之路:基本语法与技巧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Swift 算法实战之路:基本语法与技巧_app_内存溢出

Swift 算法实战之路:基本语法与技巧

Swift 算法实战之路:基本语法与技巧,第1张

概述Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。 基本语法

Swift是苹果新推出的编程语言,也是苹果首个开源语言。相比于原来的Objective-C,Swift要更轻便和灵活。笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体会总结于下。此文并不是纯粹讨论Swift如何实现某一个具体的算法或者数据结构,如冒泡排序、深度优先遍历,或是树和栈,而是总结归纳一些Swift常用的语法和技巧,以便大家在解决面试题中使用。

基本语法

先来看下面一段代码

func swap(chars:[Character], p: Int,q: Int) {  var temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(array,p: 0,q: 1)

上面代码实现了一个非常简单的功能,就是交换一个数组中的两个值。乍一看非常正确,实际上存在以下几个问题。

在第一个参数前应该加上 inout 关键字。因为在Swift中,struct都是按值传递,class是按引用传递;数组和字典都是struct。所以要改变原来的chars数组,在其前部加入inout关键字,表示是按引用传递。p 和 q 之前应该加入下划线。Swift默认函数的第一个参数是局部(local)变量,而后续参数都是外部(external)变量,外部变量必须声明。如果在p和q前加上下划线,则在调用函数时无需声明外部变量,这样调用起来更简便。temp前的var应该改为let。let用于声明常量(constant),var用于声明变量(variable)。swap函数中,temp并未进行修改,所以应当视为常量,用let来声明。

修改过后的代码为

func swap(inout chars:[Character], _ p: Int,_ q: Int) {  let temp = chars[p]  chars[p] = chars[q]  chars[q] = temp}// Assume array is a character array and it has enough elementsswap(&array,1)

再来看一段代码

func toZero(x: Int) -> Int {  while x > 0 {    x -= 1  }  return x}

这里在 x -= 1 处会报错。原因是函数中所有的参数是常量(let),是不可以修改的。解决的方法是在函数中写上var x = x,之后就可以对 x 进行修改了

循环

Swift循环分为for和while两种,注意他们的结构跟传统的 Java,C/C++有很大区别,笔者将其总结如下

// Assume names is an array holds enough Strings// for loopfor name in names { }for i in 0 ... names.count - 1 { }for i in 0 ..< names.count { }for _ in 0 ..< names.count { }for name in names.reverse() { }for i in 0.strIDe(through: names.count - 1,by 2) { }for i in 0.strIDe(to: names.count,by: 2) { }// while loopvar i = 0while i < names.count { }repeat { } while i < names.count

以上代码非常简单。需要说明的有两个,一个是 for _ in 0 ..< names.count { } 。当我们不需要数组中每一个具体的元素值时,我们就可以用下划线来代表序号。
另一个是是 repeat { } while i < names.count 。这个相当于我们熟悉(java)的 do { } while (i < names.length)。

排序

swift排序效率很高,写法也很简洁。笔者将其总结如下

// Sort an Int array,ascendingnums.sortInPlace({
// Returns the index of the first occurrence of needle in haystack,// or -1 if needle is not part of haystackfunc strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  if hChars.count < nChars.count {    return -1  }  if hChars.count == 0 {    return -1  }  for i in 0 ... hChars.count - nChars.count {    if hChars[i] == nChars[0] {      for j in 0 ..< nChars.count {        if hChars[i + j] != nChars[j] {          break        } else {          if j == nChars.count - 1 {            return i          }        }      }    }  }    return -1}
< })// Sort an Int array without mutating the original one,ascendingvar sortednums = nums.sort({
func strStr(haystack: String,_ needle: String) -> Int {  var hChars = [Character](haystack.characters)  var nChars = [Character](needle.characters)  guard hChars.count >= nChars.count else {    return -1  }  if nChars.count == 0 {    return 0  }  for i in 0 ... hChars.count - nChars.count {    guard hChars[i] == nChars[0] else {      continue    }    for j in 0 ..< nChars.count {      guard hChars[i + j] == nChars[j] else {        break      }      if j == nChars.count - 1 {        return i      }    }  }  return -1}
< })// Sort an array with custom-defined objects,ascendingtimeIntervals.sortInPlace({
文/故胤道长(简书作者)原文链接:http://www.jianshu.com/p/ee16bcf50a59
.startTime < .startTime})// Sort keys in a dictionary according to its value,ascendinglet keys = Array(dict.keys)var sortedKeys = keys.sort() {  let value0 = dict[微信号:iOSDevTip]  let value1 = dict[]  return value0 < value1}
活用Guard语句

使用Guard语句可以让逻辑变得非常清楚,尤其是在处理算法问题的时候,请看下面的代码

长按上图,d出“识别二维码”后关注

上面这段代码是求字符串needle在字符串haystack里首次出现的位置。我们发现for循环中的嵌套非常繁琐,但是如果使用Guard语句代码会变得清晰很多:

微信号:CodePush

Guard语句的好处是判断条件永远是我们希望的条件而不是特殊情况,且成功避免了大量的if嵌套。

另外在上面代码中,为何要将字符串转化成数组进行处理?因为Swift中没有方法能够以O(1)的时间复杂度取得字符串中的字符,我们常用的string.startIndex.advancedBy(n)方法,其时间复杂度为O(n)。所以笔者在这里以空间换时间的方法进行了优化。
总结

Swift是一门独特的语言,本文对其基本知识和语法进行了适当归纳,文中提到的都是基本细节。下期我们会讨论更加进阶的内容。

微信号:AndroIDPush

2016年最热门的公众号精选


iOS开发

「iOS开发」最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!


微信号:SwiftDev


猿圈

「猿圈」为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。


微信号:aswifter


AndroID开发精选

「AndroID开发精选」定期翻译、发布国内外AndroID优质的技术文章、开源库、软件架构设计、测试等,让我们的技术跟上国际步伐.


微信号:PythonPush



长按上图,d出“识别二维码”后关注

Swift开发

「Swift开发」探讨移动开发技术,推荐常用框架,分享移动互联网资讯。  主要提供Swift,IOS等相关技术资讯




APP开发者

「APP开发者」分享IOS开发,Swift开发,AndroID 开发和互联网内容



Python开发

「Python开发」人生苦短,我用 Python。Python 越来越受广大程序员的喜爱。


总结

以上是内存溢出为你收集整理的Swift 算法实战之路:基本语法与技巧全部内容,希望文章能够帮你解决Swift 算法实战之路:基本语法与技巧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1025694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)