as! ios swift
IOS Swift
2018-09-25 11:51:47 weixin_42521912 阅读数 93

一. 在viewcontroller里

import UIKit

var page = UIPageControl()

class ViewController: UIViewController,UIScrollViewDelegate {

 

    override func viewDidLoad() {

        super.viewDidLoad()

        let imageArr = ["browse","businesscard","computer"]

 

        // 创建滚动视图

        let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))

       

        scrollView.delegate = self

        

        

        // 设置分页滚动

        scrollView.isPagingEnabled = true

        // 添加视图

        self.view.addSubview(scrollView)

         page = UIPageControl(frame: CGRect(x: (scrollView.frame.size.width - 150)/2, y: 550, width: 150, height: 50))

        page.numberOfPages = imageArr.count

        page.currentPage = 0

        page.currentPageIndicatorTintColor = UIColor.red

        page.pageIndicatorTintColor = UIColor.lightGray

        self.view .addSubview(page)

       

        

        for i in 0..<imageArr.count {

            // 添加图片

            let imageV = UIImageView(frame: CGRect(x:scrollView.frame.size.width * CGFloat(i) , y: 0, width: scrollView.frame.size.width, height: scrollView.frame.size.height))

            imageV.image = UIImage(named: imageArr[i])

            imageV.isUserInteractionEnabled = true

            if i == 2{

                var button = UIButton (type: UIButtonType.system)

                button = UIButton(frame: CGRect(x: (scrollView.frame.size.width - 150)/2, y: 350, width: 150, height: 50))

                

                button.backgroundColor = UIColor .blue

                button.setTitle("立即体验", for: UIControlState.init(rawValue: 0))

                button.setTitleColor(UIColor.white, for: UIControlState.init(rawValue: 0))

                button.addTarget(self, action: #selector(self.push), for: UIControlEvents.touchUpInside)

                imageV.addSubview(button)

                

            }

            // 把图片添加到滚动视图上

            scrollView.addSubview(imageV)

        }

        

        // 设置滚动范围

        scrollView.contentSize = CGSize(width: scrollView.frame.size.width * CGFloat(imageArr.count), height: 0)

        

        

    }

    // 按钮跳转

    @objc func push(){

        let  new  = NewViewController()

        self.present(new, animated: true, completion: nil)

        

    }

    // scrollview 代理

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let ofset = scrollView.contentOffset.x/self.view.frame.size.width

        page.currentPage = Int(ofset)

        

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

 

    }

 

 

}

二 新建NewViewController

 

import UIKit

 

class NewViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 12 ;

    }

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let identifier = "cell"

        var  cell = tablview?.dequeueReusableCell(withIdentifier:identifier)

        if cell == nil{

            cell = UITableViewCell(style: .default, reuseIdentifier: identifier)

        }

//        cell?.detailTextLabel?.text = "模拟月考"

        cell?.textLabel?.text = "模拟数据"

        return cell!

    }

    

    var tabArr:[Model]?

    var tablview:UITableView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.view.backgroundColor  = UIColor.white

    // 创建表格

        self.tablview = UITableView(frame: self.view.frame, style: .plain)

        self.tablview?.delegate = self

        self.tablview?.dataSource = self

        self.view.addSubview(tablview!)

    }

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        

    }

    

    // 请求网络数据

    func requestNetWorlData() -> Void {

        // 转动菊花

        UIApplication.shared.isNetworkActivityIndicatorVisible = true

        // 开始请求

        let urlService = Headle()

        urlService.getNewsData(channel: "头条", startSum: 0)

        DispatchQueue.main.async {

            self.tablview?.reloadData()

        }

    }

    三 . 创建model

import UIKit

 

class Model: NSObject {

    var pic:String = ""

    var title:String = ""

    var weburl:String = ""

}

四 创建一个Headle 实现model

import UIKit

 

class Headle: NSObject {

    func getNewsData(channel:String,startSum:Int) -> Void {

        var urlStr = "http://api.jisuapi.com/news/get?channel=头条&start=0&num=10&appkey=de394933e1a3e2db"

        urlStr = urlStr.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlFragmentAllowed)!

        let url = URL(string: urlStr)

        let red  =  URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10.0)

        let task:URLSessionDataTask = URLSession.shared.dataTask(with: red) { (data, response, error) in

            if error != nil{

            return

            }

            let jsonData = try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)

            _ = (jsonData as! NSDictionary) .value(forKey: "status")as! String

            

            _ = (jsonData as! NSDictionary).value(forKey: "msg") as! String

            let result = (jsonData as! NSDictionary).value(forKey: "result") as! NSDictionary

            let list = (result.value(forKey: "list") as! NSArray)

            var arr:[Model] = []

            for item in list{

                let dic = (item as! NSDictionary)

                let oneNew = Model()

                oneNew.title = dic.value(forKey: "title")as!String

                oneNew.pic = dic.value(forKey: "pic")as!String

                oneNew.weburl = dic.value(forKey: "weburl")as!String

                arr.append(oneNew)

            }

         }

         task.resume()        

    }

}

 

2014-06-06 11:05:41 superfang119 阅读数 447
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错:
?
1
2
3
4
5
var stringValue : String  
//error: variable 'stringValue' used before being initialized
//let hashValue = stringValue.hashValue
//                            ^
let hashValue = stringValue.hashValue

上面了解到的是普通值,接下来Optional值要上场了。Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因, 也是PlayGround会把Optional值显示为类似{Some "hello world"}的原因,这里是enum Optional的定义:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)
  
    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool
  
    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}

声明为Optional只需要在类型后面紧跟一个?即可。如:
?
1
var strValue : String?  

一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:
?
1
2
3
if strValue {
    //do sth with strValue
}

然后怎么使用Optional值呢?文档中也有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,“Optional Chaining的问号的意思是询问是否响应后面这个方法,和原来的isResponseToSelector有些类似”,如果是nil值,也就是Optional.None,固然不能响应后面的方法,所以就会跳过,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,比如:
?
1
let hashValue = strValue?.hashValue  

strValue是Optional的字符串,如果strValue是nil,则hashValue也为nil,如果strValue不为nil,hashValue就是strValue字符串的哈希值

到这里我们看到了?的两种使用场景:

1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作

另外,对于Optional值,不能直接进行操作,否则会报错:
?
1
2
3
4
5
//error: 'String?' does not have a member named 'hashValue'
//let hashValue = strValue.hashValue
//                ^        ~~~~~~~~~
  
let hashValue = strValue.hashValue

上面提到Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?拆包提到了几种方法,一种是Optional Binding, 比如:
?
1
2
3
if let str = strValue {
    let hashValue = str.hashValue
}

还有一种是在具体的操作前添加!符号,好吧,这又是什么诡异的语法?!

直接上例子,strValue是Optional的String:
?
1
let hashValue = strValue!.hashValue

这里的!表示“我确定这里的的strValue一定是非nil的,尽情调用吧” ,比如这种情况:
?
1
2
3
if strValue {
    let hashValue = strValue!.hashValue
}

{}里的strValue一定是非nil的,所以就能直接加上!,强制拆包(unwrap)并执行后面的操作。 当然如果不加判断,strValue不小心为nil的话,就会出错,crash掉。

考虑下这一种情况,我们有一个自定义的MyViewController类,类中有一个属性是myLabel,myLabel是在viewDidLoad中进行初始化。因为是在viewDidLoad中初始化,所以不能直接声明为普通值:var myLabel : UILabel,因为非Optional的变量必须在声明时或者构造器中进行初始化,但我们是想在viewDidLoad中初始化,所以就只能声明为Optional:var myLabel: UILabel?, 虽然我们确定在viewDidLoad中会初始化,并且在ViewController的生命周期内不会置为nil,但是在对myLabel操作时,每次依然要加上!来强制拆包(?也OK),比如:
?
1
2
3
myLabel!.text = "text"
myLabel!.frame = CGRectMake(0, 0, 10, 10)
...

对于这种类型的值,我们可以直接这么声明:var myLabel: UILabel!, 果然是高(hao)大(fu)上(za)的语法!, 这种是特殊的Optional,称为Implicitly Unwrapped Optionals, 直译就是隐式拆包的Optional,就等于说你每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作,当然如果该值是nil,也一样会报错crash掉。

那么!大概也有两种使用场景

1.强制对Optional值进行拆包(unwrap)
2.声明Implicitly Unwrapped Optionals值,一般用于类中的属性

Swift是门新生的语言,我们有幸见证了它的诞生,激动之余也在佩服苹果大刀阔斧的推出一个新的语言替代一个已经比较成熟语言的魄力,今天在知乎日报上看到一个回答是说Swift是一门玩具语言,正当想去吐槽,发现回答已经被删除了。个人认为苹果是很认真的推出Swift的,从Swift的各种细微的设计也能看的出来。

另外这两个小符号就花费了我不少的时间来理解,可能依然会有错误和不妥之处,欢迎大家指正,本文旨在抛砖引玉。除此之外,Swift还有很多很棒的特性,WWDC 2014 会有四五个和Swift语言相关的Video,大家也可以去关注一下。
2016-04-23 10:25:00 weixin_34217711 阅读数 19

Swift中没有.h .m文件

Swift中.swift文件声明实现不在创建

导入类名:不需要再导入类名所有类名都是分开的可以直接访问到

导入框架:直接导入框架名如:importUIKit

OC程序入口是main函数

Swift代码是从上往下顺序执行@UIApplicationMain程序的主入口

class:用来声明类

实例:class

AppDelegate: UIResponder ->class类名:父类

导入代理协议名字:在父类后面继续添加逗号写上代理、协议名字

Swift声明变量:varwindow:UIWindow?

Swift声明方法:func用来表示方法

----------------------------

变量、常量的声明:

var声明变量

let声明常量不允许改变

OC:数据类型名字=值

Swift:

var名字:数据类型=值

let名字:数据类型=值

Swift里面语句结束可以不写分号但是如果一行有多条语句必须添加分号

Swift也支持中文作为变量名

字符串可以直接通过+拼接

如果声明的对象是变量但是并没有去改变这个变量的值系统会提示可以声明成常量

Xcode7.3后(swift2.2) ++将在swift3中弃用改成+=

Swift自动推断数据类型如果没有告诉变量的数据类型会自动推断数据类型

Swift不同的数据类型不允许计算

数据类型转换:数据类型(要转换的变量)

如果声明变量的时候不想在声明的时候去赋值必须添上变量的数据类型(没有推断的依据推断不出数据类型)

--------------------------

Swift方法的定义和调用

func定义方法

func方法的名字()

OC:

- (void)viewDidLoad{

}

Swift:

func viewDidLoad()

oc:

- (void)viewDidAppear:(BOOL)animated{

}

Swift:

funcviewDidAppear(animated:Bool) {

}

---------------------

Swift中调用其他类的方法用.来调用

区间

全闭合区间区间

半闭合区间

12345

全闭合区间1...5

1234(5)

半闭合区间1..5

在swift中提倡用区间

--------------------------

函数

{}范围

func函数名(){}

class类名:父类{}

var变量名=值

let常量名=值

调用别的方法通过.调用

color.redColor()

小括号代表是一个方法

--------------------------

可选类型(可空类型):

swift数据类型是非常严谨的,语法不严谨(英文、中文)在实际工作的时候,有可能会把一个空值赋给一个变量

swift不支持不同数据类型赋值

故swift出来一个解决办法--->可选类型(可空类型)

可选类型的符号:

?表示声明的是一个可选类型,它也是一种数据类型

!表示拆包把可选类型转换成原有数据类型

拆包:转换成原有数据类型

Optional(傻狗)->傻狗

隐式拆包:可选类型变量后!->let

name1:NSString! = name;

显式拆包:name!

声明:

var变量名:数据类型?

var

window: UIWindow?

----------------------------

as作为、明确数据类型->使用(1、跟其他数据类型计算《两者是包含关系》2、需要把子类转换成父类的时候)

as ->明确数据类型->在使用的时候

as->子类转父类(明确子类是父类)

NSString是一个类->结构体string

***不同数据类型之间转换必须有支持数据类型的转换方法才可以转换

***如果是自类转父类可以直接赋值

is判断是不是某个数据类型某一数据类型(类名)

swift字符串判断==是否相同

插入字符串"XXX\(插入的内容)"

-----------------------------

枚举:

变化:不止可以把数字当做枚举,同时还可以把字符串当做枚举值,还可以把几个内容放在一个枚举值里面

变化:元素之前使用case表示

在使用的时候枚举的名字.元素、.元素

rawValue枚举里面的值

声明枚举的公式:

第一种、

enum枚举名字:Int{

case元素

case元素

case元素

}

第二种、

enum枚举名字:Int{

case元素,元素,元素

}


元组:tuple

1.可以存放不同数据类型的元素

2.取值方式

1.可以使用下标取值,也是从零开始

2.通过key取值(必须定义)

公式:1. (1,"mm",对象)通过下标

2. (key:值,key:值)通过key,可以取到不同类型的值key不需要引号

闭包:

封闭的代码块也可以把函数当成一个闭包

let闭包名字= {(参数列表) ->返回值类型in

具体执行的代码

如果有返回值,就return返回值

}

in前面是声明后面是实现in后面进入代码块

swift:

数组字典:[]

元组:()

oc:

数组:[]

字典:{}

1.完整公式

{(参数列表)->返回值类型in实现代码}

如:let block

= {(a:Int, b:Int)->Intinreturna +

b}

2.简化版:无参数无返回值公式

{实现代码}

如:let block = {}

3.简化版:有参数无返回值公式

{(参数列表)in实现代码}

如:let block

= {(a:Int)inprint(a)}

4.调用

闭包名()

如:block()

1.声明包含闭包的方法

func方法名(闭包名:(参数列表)->返回值类型){闭包名(实参列表)}

如:func

loadData(respose:(message:NSString)-Void){respose(message:"完成")}

2.调用包含闭包的方法

方法名{(参数列表)in实现代码}

如:loadData{(message:NSString)inprint(message)}

三:typealias替代

typealias要替代成的名字=要替代的数据类型

如:typealias

Height =Float

结构体

1.增加方法(可以调用方法也可以添加方法)

2.增加实例化方法

调用

使用实例化方法

结构体

1.改变

《1》自动生成实例化方法

《2》可以在结构体中创建方法

《3》可以在结构体中调用方法

2.公式

声明:

struct结构体名{

let(var)变量?

func(){}

}

如果方法改变结构体中的值需要在方法前面加上mutabing

使用:

let(var)变量名=结构体名.init()

let(var)变量名=结构体名.init(实参)

3.与类的区别

1.结构体偏向于处理数据

2.类偏向于处理逻辑、关系

3.类中的对象有对象的特征:封装继承多态

4.引用计数的处理结构体有专门处理变量的引用计数

iOS SWIFT
2016-04-19 13:26:00 weixin_34150224 阅读数 23
2015-12-09 10:26:00 weixin_30673715 阅读数 5

http://blog.csdn.net/iflychenyang/article/details/8876542(如何在Objective-C的头文件引用C++的头文件

1.将.m文件扩展名改为.mm,或者修改.m文件的File Type,改为Objective C++ Source.

2.将.h文件File Type改为Objective C++ Preprocessed Source,默认C Header.

注意:File Type 在xcode右边属性栏中修改

 

视频:http://www.jikexueyuan.com/course/261.html

参考:http://www.tuicool.com/articles/QZNrErM

一个从Swift调用ObjC函数的例子 :http://www.cocoachina.com/bbs/read.php?tid=204684

即使你尽量用Swift编写iOS程序,难免会遇到部分算法是用C++语言编写的。那你只能去问问”度娘“或“狗哥”怎么用 Swift 调用C++算法。

一,C,C++, Objective-C,Swift有什么关系,还有什么是混编 -.-?

1. 当然是兄弟关系,虽然Objective-C是扩充C的 面向对象 编程语言,C++是在C语言的基础上开发的一种通用 编程语言 。Swift是由苹果公司推出有意让其与Objective-C共存于苹果公司操作系统上。但是Objective-C一直是由苹果公司来抚养,C,C++也因为苹果公司才变得如此流行。

2. 混编,就是混合编译-.-强大吧,好好感受史蒂夫 乔布斯对开发技术人员的尊重和期待。

3. C,C++, Objective ,Swift 但就像《 葫芦娃 》里面七个兄弟中的四个一样牛掰,七葫芦娃是最厉害的,但需要七个兄弟齐心协力才能收妖。类似的,Swift是最小的弟弟,这就意味着Swift是最厉害的。我们在接近新宠Swift的同时,也要经常复习其他语言,不要忘记他的哥哥们。

二,小小的比较

1. Swift和Objective-C

我们都体会得到Swift调用Objective-C并不难,也不麻烦。你只要在swift的工程里创建OC的文件,系统就会提问帮你生成一个bridging-header,只要在这个bridging-header里import所有要用到的OC的头文件,就可以在swift文件里用swift的语言风格来调用OC类了。

2. Swift和C++

C++ 并不 是 像 Objective-C 这样。首先,我们应该想到 Objective-C 与 C++ 是 可以 混编 得 perfect ,而且可以使用 STL ,办法就 是 将 OC 的.m文件后缀改成.mm,然后在 OC 类中写一个 wraper ,然后在里面调用 C++ 的类,封装成几个公共的方法就可以了。这时再用 swift 来调用 wraper 里的方法,就可以执行 C++ 语句了。

三,iOS OC和Swift混编

1. 创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest 

2. 在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES 

3. 这时会在工程里看到下图这样一个头文件.

4. 在这个头文件里添加你的OC文件的.h文件,就可以在任意swift文件中自行调用所包含的oc文件了。

5. 接下来在工程的target-》build Setting->package下个性如下两项

6. 然后在OC代码的.m文件中引入  + “-swift.h” 这样一个头文件,比如我的工程会生成 SwiftTest-swift.h这样一个头文件的。   然后你的.m文件就可以随便调用swift文件了。

其实如果你设置的Defines Module = YES了,   xcode就会默认生成Product Module Name - swift.h这样一个头文件,这个头文件下会有你所有.swift文件的.h信息。

 

http://files.cnblogs.com/files/lyggqm/Swift%E4%B8%8EOC%E4%B8%8ECplus%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B.zip

  吐槽,博客园上传文件的方式,令人发指!!我现在还没找到怎么上传文件到随笔里!

http://files.cnblogs.com/files/lyggqm/Swift%E4%B8%8EOC%E4%B8%8ECplus%E6%B7%B7%E5%90%88%E7%BC%96%E7%A8%8B.zip

 

转载于:https://www.cnblogs.com/lyggqm/p/5032042.html

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