2018-02-09 14:54:36 ZY_FlyWay 阅读数 1606
  • 《从零开始学Swift》同步练习题解析

    本视频是基于Swift2.x版本录制,与图书《从零开始学Swift》同步练习题讲解。是学习Swift视频,巩固Swift知识习题。 同步练习是为了帮助消化吸收图书《从零开始学Swift》和“读书看视频——《从零开始学Swift》视频”的内容,在本书语法篇后面都安排了数量不等的练习题。

    13906 人正在学习 去看看 关东升

Swift 4.0访问权限关键字

    目前有 open  public  internal  fileprivate  private 这五个访问权限,都可以修饰属性和方法。下面通过例子来分析五个访问权限的使用。


不同点分析:

  • 是否可以被子类继承访问
  • 同文件不同类下是否可以访问
  • 不同文件是否可以被访问
  • 不同组件下是否可以被访问

1、private

被private修饰的属性和方法  ,只可以在该类下使用(extension可使用,因为是同类。)

例如:下面图片,即使在同文件下不同类也是不能调用的,继承的话子类也不能调用。



2、fileprivate

      fileprivate和private 想比较一下,区别一目了然,相同文件下是可以调用的,其他和private一样。

 

3、internal 

 

      默认权限,如果项目没有进行组件化开发,整个APP项目内都是可以访问的。

 

4、public

 可以被任何人访问,但是在其他module中不可以被继承和重写,在当前module内可以


5、open  


  最高权限,可以被任何module和文件访问和继承重写


2018-01-08 11:36:02 hsf_study 阅读数 1883
  • 《从零开始学Swift》同步练习题解析

    本视频是基于Swift2.x版本录制,与图书《从零开始学Swift》同步练习题讲解。是学习Swift视频,巩固Swift知识习题。 同步练习是为了帮助消化吸收图书《从零开始学Swift》和“读书看视频——《从零开始学Swift》视频”的内容,在本书语法篇后面都安排了数量不等的练习题。

    13906 人正在学习 去看看 关东升

我写了个常用的宏定义:  github去下载使用.点击打开链接

//
//  HSFMacroTool.swift
//  BBTalkStory
//
//  Created by HSF on 2018/1/6.
//  Copyright © 2018年 HSF. All rights reserved.
//

import UIKit
// MARK: ===================================变量宏定义=========================================

// MARK: 系统相关
/// Info
public let kAppBundleInfoVersion = Bundle.main.infoDictionary ?? Dictionary()
/// plist:  AppStore 使用VersionCode 1.0.1
public let kAppBundleVersion = (kAppBundleInfoVersion["CFBundleShortVersionString" as String] as? String ) ?? ""
/// plist: 例如 1
public let kAppBundleBuild = (kAppBundleInfoVersion["CFBundleVersion"] as? String ) ?? ""
public let kAppDisplayName = (kAppBundleInfoVersion["CFBundleDisplayName"] as? String ) ?? ""

// MARK: 系统相关
public let kiOSBase = 8.0
public let kOSGreaterOrEqualToiOS8 = ( (Double(UIDevice.current.systemVersion) ?? kiOSBase) > 8.0 ) ? true : false;
public let kOSGreaterOrEqualToiOS9 = ((Double(UIDevice.current.systemVersion) ?? kiOSBase) >= 9.0 ) ? true : false;
public let kOSGreaterOrEqualToiOS10 = ((Double(UIDevice.current.systemVersion) ?? kiOSBase) >= 10.0 ) ? true : false;
public let kOSGreaterOrEqualToiOS11 = ((Double(UIDevice.current.systemVersion) ?? kiOSBase) >= 11.0 ) ? true : false;

//设备宽高、机型
public let kScreenHeight = UIScreen.main.bounds.size.height
public let kScreenWidth = UIScreen.main.bounds.size.width
public let kStatusBarheight = UIApplication.shared.statusBarFrame.size.height
public let kNavBarHeight_StatusHeight: ((UIViewController)-> CGFloat) = {(vc : UIViewController ) -> CGFloat in
    weak var weakVC = vc;
    var navHeight = weakVC?.navigationController?.navigationBar.bounds.size.height ?? 0.0
    return (navHeight + kStatusBarheight)
}


// MARK: ============================================================================
// MARK: Dictory Array Strig Object 闭包方式
///过滤null对象
public let kFilterNullOfObj:((Any)->Any?) = {(obj: Any) -> Any? in
    if obj is NSNull {
        return nil
    }
    return obj
}

///过滤null的字符串,当nil时返回一个初始化的空字符串
public let kFilterNullOfString:((Any)->String) = {(obj: Any) -> String in
    if obj is String {
        return obj as! String
    }
    return ""
}

/// 过滤null的数组,当nil时返回一个初始化的空数组
public let kFilterNullOfArray:((Any)->Array<Any>) = {(obj: Any) -> Array<Any> in
    if obj is Array<Any> {
        return obj as! Array<Any>
    }
    return Array()
}


/// 过滤null的字典,当为nil时返回一个初始化的字典
public let kFilterNullOfDictionary:((Any) -> Dictionary<AnyHashable, Any>) = {( obj: Any) -> Dictionary<AnyHashable, Any> in
    if obj is Dictionary<AnyHashable, Any> {
        return obj as! Dictionary<AnyHashable, Any>
    }
    return Dictionary()
}


// MARK: ============================================================================
// MARK: 设置Nib、Stryboard、UIImage

/// 根据imageName创建一个UIImage
public let imageNamed:((String) -> UIImage? ) = { (imageName : String) -> UIImage? in
    return UIImage.init(named: imageName)
}


/// 根据Main.storyboard建立ViewController
public let VC_From_Main_SB:((String)-> UIViewController? ) = {(SBID : String) -> UIViewController? in
    return UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier:SBID)
}


// MARK: ============================================================================
// MARK: 设置颜色
/// 设置颜色值
public let HexRGB:((Int) -> UIColor) = { (rgbValue : Int) -> UIColor in
    return HexRGBAlpha(rgbValue,1.0)
}

/// 通过 十六进制与alpha来设置颜色值  ( 样式: 0xff00ff )
public let HexRGBAlpha:((Int,Float) -> UIColor) = { (rgbValue : Int, alpha : Float) -> UIColor in
    return UIColor(red: CGFloat(CGFloat((rgbValue & 0xFF0000) >> 16)/255), green: CGFloat(CGFloat((rgbValue & 0xFF00) >> 8)/255), blue: CGFloat(CGFloat(rgbValue & 0xFF)/255), alpha: CGFloat(alpha))
}


/// 通过 red 、 green 、blue 、alpha 颜色数值
public let RGBAlpa:((Float,Float,Float,Float) -> UIColor ) = { (r: Float, g: Float , b: Float , a: Float ) -> UIColor in
    return UIColor.init(red: CGFloat(CGFloat(r)/255.0), green: CGFloat(CGFloat(g)/255.0), blue: CGFloat(CGFloat(b)/255.0), alpha: CGFloat(a))
}
使用方式:

普通宏定义:

let height = kScreenHeight

print(height)

闭包类型的宏定义:

self 是控制器。

let navHeight = kNavBarHeight_StatusHeight(self)

print(navHeight)

  

2014-06-20 15:34:37 leihua713 阅读数 5035
  • 《从零开始学Swift》同步练习题解析

    本视频是基于Swift2.x版本录制,与图书《从零开始学Swift》同步练习题讲解。是学习Swift视频,巩固Swift知识习题。 同步练习是为了帮助消化吸收图书《从零开始学Swift》和“读书看视频——《从零开始学Swift》视频”的内容,在本书语法篇后面都安排了数量不等的练习题。

    13906 人正在学习 去看看 关东升


本文是在xocde6 beta1版本下写得,到xcode6正式版本后会有些小错误,请参看我的另一篇博客swift第一个ios项目,纯代码编程(续)http://blog.csdn.net/lh_work/article/details/40787265

是在本文基础上修改和添加了一些东西

最近看了看网上关于swift的一些基础介绍,大部分都采用了storyboard的方式来设计界面。但是本人还是比较喜欢以纯代码的方式来写代码的,呵呵,和本人的习惯有关。所以在这里介绍一下怎么样基于swift语言用纯代码的方式来写一个小应用吧。


当前AppStore中还没有推出Xcode6的正式版本,只能去官网用开发者账号下载beta版本,同时Xcode6要求OS X版本在10.9.3以上版本,所以发现无法使用Xcode6的朋友先升级下系统吧。


现在开始打开Xcode6来创建一个新项目吧




选择Empty Application后点击next后再选择存储位置,这里就不赘述了,直接开始写代码吧


进入项目的时候只有一个AppDelegate.swift代码文件,和以前的ios项目中.h和.m文件实现一个类不同,swift语言将.h和.m中合并成了一个.swift来实现

那么我们现在先来创建一个试图控制器ViewController,为方便下一步给UIWindow设置根试图控制器


选择Cocoa Touch Class点击Next 继续




照着图选择继承的类和swift语言点击Next


此时将多出了一个ViewController.swift代码文件,进入这个代码文件将其init方法删除,记得必须删除,因为我们下面是用纯代码创建对象的,如果不删除这个nib初始化方法,下面在AppDelegate中创建的时候将会出错。

 init(nibName nibNameOrNil:String?, bundle nibBundleOrNil:NSBundle?) {

       super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        // Custom initialization

    }

删除。

回到AppDelegate中开始写代码



func application(application:UIApplication, didFinishLaunchingWithOptions launchOptions:NSDictionary?) -> Bool {

        //创建试图控制器

       var vc =ViewController()

        //创建导航控制器,并设置其根试图控制器为vc

       var nav   =UINavigationController(rootViewController:vc);

        


        

       self.window =UIWindow(frame:UIScreen.mainScreen().bounds)

        // Override point for customization after application launch.

       self.window!.backgroundColor =UIColor.whiteColor()

        //设置UIWindow的根试图控制器

       self.window!.rootViewController = nav;

        self.window!.makeKeyAndVisible()

       returntrue

    }



这样就实现了纯代码的方式在swift基础上实现程序试图控制器的跳转了,接下来我们在试图控制器中添加并实现一个简单的tableview的使用


进入ViewController中



//创建tableview

   var tableView :UITableView?

    

       overridefunc viewDidLoad() {

       super.viewDidLoad()

           self.title ="MySwift"

       setupViews()


        // Do any additional setup after loading the view.

    }

   func setupViews()

    {

        //初始化tableview并设置frame

       self.tableView =UITableView(frame:self.view!.frame)

        //设置tableview的代理对象

       self.tableView!.delegate =self

       self.tableView!.dataSource =self

       self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier:"cell")

//将tableview添加到view试图上

       self.view?.addSubview(self.tableView)

    }

    


在这里要注意的是设置tableview的代理对象的时候会报错,其实就是因为没有在类中继承代理协议,这个和以前的警告不同直接报错了,我们在类中继承tableview的代理协议


class ViewController:UIViewController ,UITableViewDelegate ,UITableViewDataSource{


大家继续写的时候发现

self.tableView!.dataSource = self

这里仍然报错,原因是UITableViewDataSource有两个必须实现的方法,只要把这两个方法粘贴到代码中就不会了,后面的报错就不一一赘述原因了,这里的报错很多就是方法没有返回值或者没有实现代理引起的警告。

好,我们下面实现两个代理方法


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

    {

       return20;

    }

    

    // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:

    // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

    

   func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell!

    {

       let cell = tableView .dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)as UITableViewCell

        cell.textLabel.text =String(format:"%i", indexPath.row+1)

       return cell

    }


这样就将这个简单的项目完成了,以上都是本人个人的一些想法实现,希望能给大家带来帮助吧。主要是为了帮助大家熟悉运用swift像以前用Objective-C编写代码的感觉吧。不足之处请大家指出,谢谢。



2015-04-21 00:14:12 qq350116542 阅读数 1009
  • 《从零开始学Swift》同步练习题解析

    本视频是基于Swift2.x版本录制,与图书《从零开始学Swift》同步练习题讲解。是学习Swift视频,巩固Swift知识习题。 同步练习是为了帮助消化吸收图书《从零开始学Swift》和“读书看视频——《从零开始学Swift》视频”的内容,在本书语法篇后面都安排了数量不等的练习题。

    13906 人正在学习 去看看 关东升

前面我们讲解了UISegemtedControl分段式控件, 现在让我们来看看 iOS 另一个非常常用的控件, UINavigationController.


1.UINavigationController常用属性

// 1.获取 UINavigationController 的顶部的视图控制器
    var topViewController: UIViewController! { get }

// 2.获取 UINavigationController 可见的视图控制器
    var visibleViewController: UIViewController! { get }

// 3.设置 UINavigationController 的 viewControllers 对象
    var viewControllers: [AnyObject]!

// 4.设置 UINavigationController 的导航栏控制器是否隐藏, 默认是 false
    var navigationBarHidden: Bool

// 5.获取 UINavigationController 的导航栏控制器
    var navigationBar: UINavigationBar { get }

// 6.设置 UINavigationController 的内置工具栏是否可见(默认是 ture)
    var toolbarHidden: Bool

// 7.获取 UINavigationController 的 toolbar
    var toolbar: UIToolbar! { get }

// 8.设置 UINavigationController 的代理对象
    var delegate: UINavigationControllerDelegate?

// 9.获取 UINavigationController 的手势识别顶部视图控制器
    var interactivePopGestureRecognizer: UIGestureRecognizer! { get }

// 10.设置 UINavigationController 当键盘出现时是否隐藏导航栏和工具栏
    var hidesBarsWhenKeyboardAppears: Bool

// 11.设置 UINavigationController 是否使用向上滑动的手势隐藏导航栏和工具栏
    var hidesBarsOnSwipe: Bool

// 12.获取 UINavigationController 用手势识别隐藏导航栏和工具栏
    var barHideOnSwipeGestureRecognizer: UIPanGestureRecognizer { get }

// 13.设置 UINavigationController 是否在垂直显示时隐藏
    var hidesBarsWhenVerticallyCompact: Bool

// 14.设置 UINavigationController 是否使用点击手势来隐藏
    var hidesBarsOnTap: Bool

// 15.获取 UINavigationController 隐藏时所使用的手势
    var barHideOnTapGestureRecognizer: UITapGestureRecognizer { get }

2.UINavigationController常用的方法

// 1.该方法是用来设置 UINavigationController 跳转到指定的视图控制器, 是否使用动画.
    func pushViewController(viewController: UIViewController, animated: Bool)

// 2.该方法是用来设置 UINavigationController Pop到其他视图控制器时是否使用动画, 并且返回的类型必须是 UIViewController
    func popViewControllerAnimated(animated: Bool) -> UIViewController?

// 3.该方法是用来设置 UINavigationController Pop到指定的视图控制器, 是否使用动画, 返回的类型是任意类型
    func popToViewController(viewController: UIViewController, animated: Bool) -> [AnyObject]?

// 4.该方法是用来设置 UINavigationController Pop到根视图时是否使用动画, 并且返回的类型必须是任意类型
    func popToRootViewControllerAnimated(animated: Bool) -> [AnyObject]?

// 5.该方法是用来替换之前于 UINavigationController 绑定的视图控制器, 并且是否使用动画
    func setViewControllers(viewControllers: [AnyObject]!, animated: Bool)

// 6.该方法是用来设置 UINavigationController 的导航栏是否隐藏, 是否使用动画
    func setNavigationBarHidden(hidden: Bool, animated: Bool)

// 7.该方法是用来设置 UINavigationController 的工具栏是否隐藏, 是否使用动画
    func setToolbarHidden(hidden: Bool, animated: Bool)

// 8.该方法是用来设置 UINavigationController 显示指定的 ViewController
    func showViewController(vc: UIViewController, sender: AnyObject!)

3.UINavigationController代理方法

// 1.该方法使用来设置 UINavigationController 将要显示时所调用的方法
    optional func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool)

 // 2.该方法使用来设置 UINavigationController 完全显示时所调用的方法
    optional func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool)

4.代码演示

首先我们要再AppDelegate.swift文件中实现

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.backgroundColor = UIColor.grayColor()
        self.window!.makeKeyAndVisible()

        let viewController = ViewController()
        let navigationController = UINavigationController(rootViewController: viewController)
        self.window!.rootViewController = navigationController

        return true
    }

遵守代理协议

class ViewController: UIViewController, UINavigationControllerDelegate { }

自定义UINavigationController

    func myNavigationContronller() {
        // 1.设置 UINavigationController 的 Title
        self.title = "UINavigationContronller"

        // 2.设置 UIVavigationController 的按钮 Title, Style, Target, Action 等方法属性
        let backBarButtonItem = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.Plain, target: self, action: "backAction")
        let nextBarButtonItem = UIBarButtonItem(title: "下一页", style: UIBarButtonItemStyle.Plain, target: self, action: "nextAction")

        // 3.设置 UINavigationItem
        self.navigationItem.leftBarButtonItem = backBarButtonItem
        self.navigationItem.rightBarButtonItem = nextBarButtonItem

        // 4.获取 UINavigationController 的顶部的视图控制器
        let topView = self.navigationController?.topViewController
        println(topView)

        // 5.获取 UINavigationController 可见的视图控制器
        let visibleView = self.navigationController?.visibleViewController
        println(visibleView)

        // 6.设置 UINavigationController 的导航栏控制器
        self.navigationController?.viewControllers

        // 7.设置 UINavigationController 的导航栏控制器是否隐藏(默认是 false)
        self.navigationController?.navigationBarHidden = false

        // 8.获取 UINavigationController 的导航栏控制器
        let navigationBar = self.navigationController?.navigationBar
        println(navigationBar)

        // 9.设置 UINavigationController 的内置工具栏是否可见(默认是 ture)
        self.navigationController?.toolbarHidden = false

        // 10.获取 UINavigationController 的 toolbar
        let toolbar = self.navigationController?.toolbar
        println(toolbar)

        // 11.设置 UINavigationController 的代理对象
        self.navigationController?.delegate = self

        // 12.获取 UINavigationController 的手势识别顶部视图控制器
        let pop = self.navigationController?.interactivePopGestureRecognizer
        println(pop)

        // 13.设置 UINavigationController 当键盘出现时是否隐藏导航栏和工具栏
        self.navigationController!.hidesBarsWhenKeyboardAppears = true

        // 14.设置 UINavigationController 是否使用向上滑动的手势隐藏导航栏和工具栏
        self.navigationController?.hidesBarsOnSwipe = true

        // 15.获取 UINavigationController 用手势识别隐藏导航栏和工具栏
        let barHide = self.navigationController!.barHideOnSwipeGestureRecognizer
        println(barHide)

        // 16.设置 UINavigationController 是否在垂直显示时隐藏
        self.navigationController!.hidesBarsWhenVerticallyCompact = true

        // 17.设置 UINavigationController 是否使用点击手势来隐藏
        self.navigationController?.hidesBarsOnTap = true

        // 18.获取 UINavigationController 隐藏时所使用的手势
        let barHideOnTap = self.navigationController!.barHideOnTapGestureRecognizer
        println(barHideOnTap)

        // 19.设置 UINavigationController 的导航栏是否隐藏, 是否使用动画
        self.navigationController?.setNavigationBarHidden(true, animated: true)

        // 20.设置 UINavigationController 的工具栏是否隐藏, 是否使用动画
        self.navigationController?.setToolbarHidden(true, animated: true)
    }

自定义代理方法以及监听方法

    // 1.该方法使用来设置 UINavigationController 将要显示时所调用的方法
    func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        println("UINavigationController 将要显示")
    }

    // 2.该方法使用来设置 UINavigationController 完全显示时所调用的方法
    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        println("UINavigationController 完全显示")
    }

    // 3.返回按钮的监听方法
    func backAction() {
        println("点击了返回")
    }

    // 4.下一页按钮的监听方法
    func nextAction() {
        println("点击了下一页")
    }

5.最终效果

1

2

PS: UINavigationController 是继承与 UIViewController 的, 所以里面的方法以及属性都是可以使用的.


好了, 这次我们就讲到这里, 下次我们继续~~

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