swift代码还原
2015-11-23 18:58:00 weixin_34146805 阅读数 1

// **************** 函数 *******************
func greet(name:String, day:String) -> String{
    return "Hello \(name), today is \(day)."
}
greet("Bob", day:"Tuesday")

// 使用元祖来让一个函数返回多个值
func calculateStatistics(scores:[Int]) -> (min:Int, max:Int, sum:Int){
    var min = scores[0]
    var max = scores[1]
    var sum = 0
    for score in scores{
        if score > max{
            max = score
        }
        if score < min{
            min = score
        }
        sum += score
    }
    return (min, max, sum)
}
let statistics = calculateStatistics([5, 3, 100, 3, 9]);
println(statistics.sum)
println(statistics.2)

// 带有可变个数参数的函数
func sumOf(numbers:Int...) -> Int{
    var sum = 0
    for number in numbers{
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)

func returnFifteen() -> Int{
    var y = 10
    func add(){
        y += 5
    }
    add()
    return y
}
returnFifteen()

func makeIncrementer() -> (Int -> Int){
    func addOne(number:Int) -> Int{
        return 1 + number
    }
    return addOne
}
var increment = makeIncrement()
increment(7)

*****************************

func vari<N>(members:N...){

    for i in members{

        println(i)

    }

}

vari(4, 3, 5)

vari(4.5, 3.1, 5.6)

vari("Google", "Baidu", "Runoob")

******************************

func makeIncrementor(forIncrement amount:Int) -> () -> Int{
    var runningTotal = 0
    func incrementor() -> Int{
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}
let incrementByTen = makeIncrementor(forIncrement:10)
print(incrementByTen())
print(incrementByTen())
print(incrementByTen())
********************************

enum Student{
    case Name(String)
    case Mark(Int, Int, Int)
}
var studDetails = Student.Name("Runoob")
var studMarks = Student.Mark
switch studMarks{
    case .Name(let studName):
        println("name: \(studName)")
    case .Mark(let Mark1, let Mark2, let Mark3):
        println("\(Mark1), \(Mark2), \(Mark3)")
}

转载于:https://www.cnblogs.com/lianfu/p/4989349.html

2016-07-27 10:33:00 weixin_34067102 阅读数 15

在swift开发中,如果不用SD第三方库,如何获取网络图片呢,其实也很简单,大家看如下的代码,简单易懂

let url = NSURL(string: collecList.store_big_avatar)!

let data = NSData(contentsOfURL: url)!

let image = UIImage(data: data,scale: 1.0)

cell.imageView2.image = image

2016-05-24 10:40:00 weixin_33806509 阅读数 9
//dispatch_async
        let mainQueue: dispatch_queue_t = dispatch_get_main_queue()
        dispatch_async(mainQueue, {() -> Void in
            print("\nthe queue is : \(NSThread.currentThread())")
        })
         
        let backgroundQueue: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
        dispatch_async(backgroundQueue, {() -> Void in
            print("\nthe queue is : \(NSThread.currentThread())")
        })
         
        //dispatch_after
        let time = dispatch_time(DISPATCH_TIME_NOW, (Int64)(10*NSEC_PER_SEC))
        dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in
            print("\ntime is : 10")
        })
         
        //dispatch_group
        let globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        let group = dispatch_group_create()
        dispatch_group_async(group, globalQueue, {
            () -> Void in
            print("group 1")
        })
         
        dispatch_group_async(group, globalQueue, {
            () -> Void in
            print("group 2")
        })
         
        dispatch_group_async(group, globalQueue, {
            () -> Void in
            print("group 3")
        })
         
//        dispatch_group_notify(group, globalQueue, {
//            () -> Void in
//            print("completed")
//        })
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
        print("\ndispatch_group completed")
         
        //dispatch_barrier_async
        NSUserDefaults.standardUserDefaults().setInteger(9, forKey: "Integer_Key")
        let barrierQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_barrier_async(barrierQueue){
            self.writeFile();
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
        dispatch_async(barrierQueue){
            self.readFile()
        }
         
        //dispatch_apply
        let applyQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        dispatch_async(applyQueue, {
            dispatch_apply(10, applyQueue, {
                (index) -> Void in
                print("\n")
                print(index)
            })
            print("\ndispatch_apply completed")
        })
        print("\n在dispatch_apply之前")
         
        //dispatch_semaphore
        let semaphoreQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        let semaphore = dispatch_semaphore_create(1)
        for _ in 0 ... 9 {
            dispatch_async(semaphoreQueue, {
                () -> Void in
                dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
                let time = dispatch_time(DISPATCH_TIME_NOW, (Int64)(NSEC_PER_SEC*2))
                dispatch_after(time, semaphoreQueue, {
                    print("\n2秒后执行")
                    dispatch_semaphore_signal(semaphore)
                })
            })
        }

class var sharedInstance: ViewController {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : ViewController? = nil
        }
        dispatch_once(&Static.onceToken, {
            Static.instance = ViewController()
        })
        return Static.instance!
    }
`````````
2017-05-03 09:54:00 weixin_33859504 阅读数 9

importUIKit// 导入 UIKit 为下面布局所用

importPlaygroundSupport// 导入 Playground 运行支持的库

// 我将会采用一种非常简洁的方式来添加界面元素、完成布局、配置界面属性但是不会用到 `Storybards`.

classOurAwesomeViewController:UIViewController{

// 在这里的所有UI元素, 我都会用 懒加载 方式来初始化

// 所谓懒加载也就说,只有在这些UI元素被添加到界面层级中去的时候,才会调用他们的内联构造函数进行初始化并且只会调用一次

// 理想情况下,我在这里想采用 lazy let 来强制保证这些UI元素在显示之后不会改变,但是 Swift 3 并不支持

// 那如果我们直接用 let 又如何呢,答案是也不行,因为如果这样的话是无法在一个方法中访问到 self 的,这个时候 self 还没有初始化完成

lazyvartitleLabel:UILabel= {

// 初始化 label

letlabel =UILabel()

// 将下面的属性禁止掉,否则会有很多布局的错误日志输出.

// 我也不清楚为什么默认值是 "true",反正现在用不到它了.

label.translatesAutoresizingMaskIntoConstraints =false

// 给 label 设置字体

label.font =UIFont(name:"Menlo", size:14)

// 设置字体颜色(注意,这里我们不会牵扯到设计的东西)

label.textColor = .white

// 当然也可以设置 label 的显示内容

label.text ="Awesome"

// 让文字内容居中

label.textAlignment = .center

returnlabel

}()

// Button 设置也大同小异

lazyvarbutton:UIButton= {

// 初始化

letbutton =UIButton()

// 禁用掉这个多余的属性

button.translatesAutoresizingMaskIntoConstraints =false

// 设置按钮的标题内容

button.setTitle("Press Me",for: .normal)

// 给按钮绑定事件函数

button.addTarget(self,

action: #selector(OurAwesomeViewController.buttonTest),

for: .touchUpInside)

returnbutton

}()

// 在这里添加布局代码,当界面准备显示在屏幕上的时候这个方法就会在 UIKit 中被调用

overridefuncloadView(){

// 如果要采用UIKit默认提供的view,请别忘了调用 super 的 loadView 方法,如果不用的话,也要给self.view赋值

super.loadView()

// 自定义 view 的背景色

view.backgroundColor = .blue

// StackView 控件会节省很多时间. 它会自动管理子界面的布局方式并且可以结合一些属性设置就可以避免臃余的界面约束

// StackView 控件还可以嵌套甚至设置一些边距以满足各种复杂的布局情况.在我看来,这种布局方式要比设置约束简单有效的多.

letverticalLayout =UIStackView(arrangedSubviews: [titleLabel, button])

// 同样的禁用掉这个属性

verticalLayout.translatesAutoresizingMaskIntoConstraints =false

// 设置垂直方向布局,并且设置填充和对齐方式.

// 这里不用记到底用了哪个属性,只要大体有个印象,用的时候查下也可以了.

verticalLayout.axis = .vertical

verticalLayout.alignment = .fill

verticalLayout.distribution = .fill

// 如果你要设置一些边距,可以像下面这样做

verticalLayout.isLayoutMarginsRelativeArrangement =true

verticalLayout.layoutMargins =UIEdgeInsets(top:20,left:20, bottom:20,right:20)

// 我们给 StackView 控件设置一些布局约束来矫正它的位置

// 这部分代码可以抽象一下写成一个类库来简化代码.在下面文章中我会展示出来

lettopConstraint =NSLayoutConstraint(item: verticalLayout,

attribute: .top,

relatedBy: .equal,

toItem: view,

attribute: .top,

multiplier:1,

constant:0)

letbottomConstraint =NSLayoutConstraint(item: verticalLayout,

attribute: .bottom,

relatedBy: .equal,

toItem: view,

attribute: .bottom,

multiplier:1,

constant:0)

letleftConstraint =NSLayoutConstraint(item: verticalLayout,

attribute: .left,

relatedBy: .equal,

toItem: view,

attribute: .left,

multiplier:1,

constant:0)

letrightConstraint =NSLayoutConstraint(item: verticalLayout,

attribute: .right,

relatedBy: .equal,

toItem: view,

attribute: .right,

multiplier:1,

constant:0)

// 现在添加到view中...

view.addSubview(verticalLayout)

// 添加上面的约束.

view.addConstraints([topConstraint, bottomConstraint, leftConstraint, rightConstraint])

}

// 当按钮被点击时,这个测试方法会被调用.

funcbuttonTest(sender: UIButton){

// 这里只是改变了界面的颜色

view.backgroundColor = .red

}

}

// 将上面的 view controller 绑定到 playground 上.

PlaygroundPage.current.liveView =OurAwesomeViewController()

PlaygroundPage.current.needsIndefiniteExecution =true

// 用纯手工的方式编写布局代码可能看起来有点费力,但这样做对于了解UI元素的布局原理,位置分布,属性设置是非常有用的.

// 采用这种方式更容易用 git 来跟踪历史变化, 所以在某些方面我个人认为要比 Interface Builder 更简单易用一些.

// 附加内容!!!

// 你可能会想把以上代码用到真是的 Xcode 工程中去,而不是仅仅在 Playgrounds 里面跑跑.

// 首先,当你创建完工程之后,在工程文件里一般会有一个 `Main Interface` 的配置,它通常是第一个要加载的 `Storyboard`.

// 现在我们不用它了,可以把它删掉.

// 下一步

// 在 AppDelegate 的 applicationDidFinishLaunchingWithOptions 中,只需要改变一行代码即可.

classAppDelegate:UIResponder,UIApplicationDelegate{

varwindow:UIWindow?

funcapplication(_application: UIApplication,

willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? =nil)->Bool{

window =UIWindow(frame:UIScreen.main.bounds)

window?.rootViewController =OurAwesomeViewController()

window?.makeKeyAndVisible()

returntrue

}

}

2016-09-12 09:40:58 u010441187 阅读数 276

英文原文:10 Swift One Liners To Impress Your Friends,译者:码农网–小峰

几年前,一篇表述“10个Scala函数式单行代码”的文章非常受欢迎,并且随后立马出现了其他的语言版本,例如Haskell版本,Ruby版本,Groovy版本,Clojure版本,Python版本,C#版本,F#版本,CoffeeScript版本等。

我们不知道有多少人真的对这些单行代码印象深刻,但我认为,这能激励大家去了解更多有关于函数式编程的内容。

1 数组中的每个元素乘以2

特别简单,尤其是使用map解决的话。

1
(1...1024).map{$0 * 2}

2 数组中的元素求和

虽然这里使用reduce和加号运算符,借助了加号运算符是函数这样一个事实,但解决办法是显而易见的,我们可以看到 reduce更具创意的用法。

1
(1...1024).reduce(0,combine: +)

3 验证在字符串中是否存在指定单词

让我们使用 filter来验证tweet中是否包含选定的若干关键字中的一个:

1
2
3
4
let words = ["Swift","iOS","cocoa","OSX","tvOS"]
let tweet = "This is an example tweet larking about Swift"
let valid = !words.filter({tweet.containsString($0)}).isEmpty
valid //true

更新:@oisdk提出一些更好的选择:

1
words.contains(tweet.containsString)

方式更简洁,还有这一个:

1
2
3
4
5
tweet.characters
.split(" ")
.lazy
.map(String.init)
.contains(Set(words).contains)

4 读取文件

像其他语言一样,通过简单的内置来读取文件到数组中是不可能,但我们可以结合使用 split 和 map创造一些不需要for循环的简短代码:

1
2
3
4
5
6
7
8
let path = NSBundle.mainBundle().pathForResource("test", ofType: "txt")
let lines = try? String(contentsOfFile: path!).characters.split{$0 == "\n"}.map(String.init)
if let lines=lines {
    lines[0] // O! for a Muse of fire, that would ascend
    lines[1] // The brightest heaven of invention!
    lines[2] // A kingdom for a stage, princes to act
    lines[3] // And monarchs to behold the swelling scene.
}

map和字符串构造函数的最后一步把我们的数组字符转换为字符串。

5 祝你生日快乐!

这将显示生日快乐歌到控制台,通过map以及范围和三元运算符的简单使用。

1
2
let name = "uraimo"
(1...4).forEach{print("Happy Birthday " + (($0 == 3) ? "dear \(name)":"to You"))}

6 过滤数组中的数字

在这种情况下,我们需要使用提供的过滤函数分区一个序列。许多语言除了拥有常用的map、flatMap、reduce、filter等,还有正好能做这件事的 partitionBy 函数,Swift如你所知没有类似的东西(NSPredicate提供的可以过滤的NSArray函数在这里不是我们所需要的)。

因此,我们可以用 partitionBy 函数扩展 SequenceType 来解决这个问题,我们将使用 partitionBy 函数来分区整型数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extension SequenceType{
        typealias Element = Self.Generator.Element
        func partitionBy(fu: (Element)->Bool)->([Element],[Element]){
        var first=[Element]()
        var second=[Element]()
        for el in self {
        if fu(el) {
        first.append(el)
    }else{
        second.append(el)
        }
    }
        return (first,second)
    }
}
let part = [82, 58, 76, 49, 88, 90].partitionBy{$0 < 60}
part // ([58, 49], [82, 76, 88, 90])

不是真正的单行代码。那么,我们是否可以使用过滤器来改善它?

1
2
3
4
5
6
7
extension SequenceType{
    func anotherPartitionBy(fu: (Self.Generator.Element)->Bool)->([Self.Generator.Element],[Self.Generator.Element]){
        return (self.filter(fu),self.filter({!fu($0)}))
    }
}
let part2 = [82, 58, 76, 49, 88, 90].anotherPartitionBy{$0 < 60}
part2 // ([58, 49], [82, 76, 88, 90])

稍微好了一点,但它遍历了序列两次,并且试图把它变成单行代码删除闭包功能将会导致太多重复的东西(过滤函数和数组会在两个地方使用)。

我们是否使用单个数据流建立一些能够将初始序列转换为分区元组的东西?是的,我们可以用 reduce。

1
2
3
4
5
var part3 = [82, 58, 76, 49, 88, 90].reduce( ([],[]), combine: {
    (a:([Int],[Int]),n:Int) -> ([Int],[Int]) in
    (n<60) ? (a.0+[n],a.1) : (a.0,a.1+[n])
})
part3 // ([58, 49], [82, 76, 88, 90])

我们在这里构建了包含两个分区的结果元组,一次一个元素,使用过滤函数测试初始序列中的每个元素,并根据过滤结果追加该元素到第一或第二分区数组中。

最后得到真正的单行代码,但要注意这样一个事实,即分区数组通过追加被构建,实际上会使其比前两个实施方式要慢。

7 获取并解析XML Web服务

上面的有些语言不依赖外部库,并默认提供多个选项来处理XML(例如Scala虽然笨拙但“本地”地支持XML解析成对象),但Foundation只提供了SAX解析器NSXMLParser,并且正如你可能已经猜到的那样,我们不打算使用它。

有几个替代的开源库,我们可以在这种情况下使用,其中一些用C或Objective-C编写,其他为纯Swift。

这次,我们打算使用纯Swift的AEXML:

1
2
3
4
5
6
7
8
9
let xmlDoc = try? AEXMLDocument(xmlData: NSData(contentsOfURL: NSURL(string:"https://www.ibiblio.org/xml/examples/shakespeare/hen_v.xml")!)!)
if let xmlDoc=xmlDoc {
    var prologue = xmlDoc.root.children[6]["PROLOGUE"]["SPEECH"]
    prologue.children[1].stringValue // Now all the youth of England are on fire,
    prologue.children[2].stringValue // And silken dalliance in the wardrobe lies:
    prologue.children[3].stringValue // Now thrive the armourers, and honour's thought
    prologue.children[4].stringValue // Reigns solely in the breast of every man:
    prologue.children[5].stringValue // They sell the pasture now to buy the horse,
}

8 在数组中查找最小(或最大)值

我们有各种方法来找到序列中的最小和最大值,其中有 minElement 和maxElement 函数:

1
2
3
4
5
6
7
8
//Find the minimum of an array of Ints
[10,-22,753,55,137,-1,-279,1034,77].sort().first
[10,-22,753,55,137,-1,-279,1034,77].reduce(Int.max, combine: min)
[10,-22,753,55,137,-1,-279,1034,77].minElement()
//Find the maximum of an array of Ints
[10,-22,753,55,137,-1,-279,1034,77].sort().last
[10,-22,753,55,137,-1,-279,1034,77].reduce(Int.min, combine: max)
[10,-22,753,55,137,-1,-279,1034,77].maxElement()

9 并行处理

某些语言允许用一种简单和透明的方式启用数组对功能,例如map和flatMap的并行处理,以加快顺序和独立操作的执行。

此功能Swift中还不可用,但可以使用GCD构建:http://moreindirection.blogspot.it/2015/07/gcd-and-parallel-collections-in-swift.html

10 埃拉托斯特尼筛法

埃拉托斯特尼筛法用于查找所有的素数直到给定的上限n。

从小于n的所有整数序列开始,算法删除所有整数的倍数,直到只剩下素数。并且为了加快执行速度,我们实际上并不需要检查每个整数的倍数,我们止步于n的平方根就可以了。

根据这一定义首次执行可能是这样的:

1
2
3
4
var n = 50
var primes = Set(2...n)
(2...Int(sqrt(Double(n)))).forEach{primes.subtractInPlace((2*$0).stride(through:n, by:$0))}
primes.sort()

我们使用外部范围来迭代我们要检查的整数,并且对于每一个整数我们使用 stride(through:Int by:Int)计算出数字的倍数的序列。那些序列然后从Set中减去,Set用所有从2到n的整数初始化。

但正如你所看到的,为了实际移除倍数,我们使用外部可变Set,导致了附带后果。

为了消除附带后果,正如我们通常应该做的那样,我们会先计算所有序列,用倍数的单一数组来flatMap它们,并从初始Set中删除这些整数。

1
2
3
4
var sameprimes = Set(2...n)
sameprimes.subtractInPlace((2...Int(sqrt(Double(n))))
.flatMap{ (2*$0).stride(through:n, by:$0)})
sameprimes.sort()

方式更清洁,使用flatMap的一个很好的例子以生成扁平化的嵌套数组。

11 其他:通过解构元组交换

最后一点,并非每个人都知道的是,和其他有tuple类型的语言一样,元组可以用来执行紧凑的变量交换:

1
2
3
4
var a=1,b=2
(a,b) = (b,a)
//2
//1

霓虹灯 swift代码

阅读数 13

Swift一次性代码

阅读数 6

Swift 代码的绅士

阅读数 29

swift 代码笔记

阅读数 292

没有更多推荐了,返回首页