mian函数 swift_mian函数 argc - CSDN
  • 创建过Swift项目的童鞋应该会发现,项目中没有一个名为main.swift的文件,为何没有了main函数,如果我想要创建UIApplication子类的时候要怎么办...

    OC项目中的main函数

    大家是否发现,以前用OC语言创建的项目,一定会有一个main.m文件,里面有一个main函数,在这个函数中唤醒app。如果在app启动时放置断点,可以看到应用程序调用栈,如下图
    这里写图片描述

    main函数作为程序启动后的第二个函数被调用,然后在main函数中再启动UIApplication,并绑定AppDelegate

    Swift项目中的main函数为何隐藏

    创建过Swift项目的童鞋应该会发现,项目中没有一个名为main.swift的文件,为什么app的入口没有了?官方文档的说法是这样的

    In Xcode, Mac templates default to including a “main.swift” file, but for iOS apps the default for new iOS project templates is to add @UIApplicationMain to a regular Swift file. This causes the compiler to synthesize a mainentry point for your iOS app, and eliminates the need for a “main.swift” file.

    这段话的意思是,Swift项目中添加了@UIApplicationMain 到swift文件中,使得编译器合成了一个app入口,所以不需要main.swift文件

    细心的童鞋会发现AppDelegate文件中多了个@UIApplicationMain的标志,启动app并放置断点,会发现其实main函数还是存在的
    这里写图片描述

    可能苹果认为我们并不需要自行配置app入口,所以干脆简化了项目配置,使用更加简单的方式启动应用,但有时候我们可能需要自己配置入口,例如我们要创建一个UIApplication的子类时

    main.swift

    如果你希望通过自行配置入口的方式来创建一个UIApplication子类,那么就要创建一个main.swift文件

    首先创建一个swift文件,命名为main
    main.swift中代码如下

    import Foundation
    import UIKit
    
    UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))

    这里把 UIApplication 换成你自定义的 ApplicationProcess 枚举在Xcode6.3以上才定义。如果你正在使用Xcode6.2以下的版本,稍微替换一下UIApplicationMain函数中代码

    UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))

    写好main.swift之后,还需要把AppDelegate中的@UIApplicationMain注释掉或者删掉
    这里写图片描述
    重新运行项目,app就能正常启动了

    main函数的参数

    以前OC的main函数的argv参数是一个字符串指针,打印出来后是应用程序的路径。swift中main函数的 Process.unsafeArgv 参数变成了一串十六进制数字,应该也是代表应用程序地址。至于为何要修改成数字,也许这是出于安全性考虑吧

    展开全文
  • Swift创建一个新的工程,项目文件中怎么没有main()函数? 用OC创建一个新项目后,会生成一个main.m的文件,里面是main函数: #import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * ...

    有些东西很简单,但是我还是把它记录了下来。

    main()函数是所有应用程序的入口,C、C++、Python等所有的应用程序都有且仅有一个main函数作为程序的入口。Swift创建一个新的工程,项目文件中怎么没有main()函数?

    用OC创建一个新项目后,会生成一个main.m的文件,里面是main函数:

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[]) {
        NSString * appDelegateClassName;
        @autoreleasepool {
            // Setup code that might create autoreleased objects goes here.
            appDelegateClassName = NSStringFromClass([AppDelegate class]);
        }
        return UIApplicationMain(argc, argv, nil, appDelegateClassName);
    }
    

    main函数里添加了一个全局的自动释放吃autorreleasepool,并返回一个UIApplicationMain()函数,UIApplicationMain()中有运行循环,使得应用程序能够持续运行起来而不至于在mian函数执行完后就停止。

    Swift工程main()函数被隐藏起来了,系统还是会自动生成main函数,只是没有提供给开发者而已。在AppDelegate中有一个@UIApplicationMain,可以理解为声明了一个mian函数,编译器收到这个指令会自动创建main函数。

    推荐阅读:

    What does “@UIApplicationMain” mean?

    展开全文
  • Swift常量与变量

    2016-04-24 16:54:58
    一、Swift, Hello, World!...1、没有main函数,其它编程语言认为mian函数是程序的入口,Swift认为程序是从上往下一行一行执行的,因此第一行代码就是程序入口。 2、语句结束时不需要加”;”,当然若你喜欢也是

    一、Swift, Hello, World!

    1、打印Hello, World!到控制台,代码如下图:

    这里写图片描述

    就一行?对,你没看错。
    2、Swift的源文件拓展名是.swift

    二、Swift和其它编程语言相比有哪些变化?
    1、没有main函数,其它编程语言认为mian函数是程序的入口,Swift认为程序是从上往下一行一行执行的,因此第一行代码就是程序入口。
    2、语句结束时不需要加”;”,当然若你喜欢也是可以加”;”
    3、如果同一行有多个语句,则依然需要加”;”,不建议一行写多条语句。
    4、定义标识符时必须声明该标识符是变量还是常量。
    5、声明标识符的格式:变量/常量关键字 名称:数据类型(当然你也可以不写数据类型,Swift会自动根据初始值确定其类型),示例如下:

    // 声明一个String类型的变量
    var name:String = "android_ls"
    // 声明一个String类型的常量
    let desc:String = "做android开发的iOS程序员"

    若你不想按上面的格式声明一个变量或者常量,可以采用下面这种写法,示例如下:

    // 声明一个String类型的变量
    var name = "android_ls"
    // 声明一个String类型的常量
    let desc = "做android开发的iOS程序员"

    6、Swift中的打印语句,如下:

    print("Hello, World!")

    三、Swift中的常量和变量
    1、在定义一个标识符时必须明确说明该标识符是一个常量还是变量
    2、使用关键字var来定义变量
    3、使用关键字let来定义常量
    4、先来看个例子,如下图

    这里写图片描述

    结论:当一个字段定义为常量时是不可以修改的。

    再看一个列子,示例代码:

     let button = UIButton()
     button.frame = CGRectMake(10, 10, 100, 100)
     button.backgroundColor = UIColor.redColor()
     self.view.addSubview(button)

    结论:定义为常量不可以修改的意思是,对象的引用不可以再指向其他对象,但是可以通过对象的引用修改其属性值。

    5、常量和变量的命名规则

    基本上可以使用任何你喜欢的字符作为常量和变量名,示例如下:

    这里写图片描述

    变量和常量名的注意点:
    不能包含数学符号(比如 +、-、*、/)
    不能是关键字(比如 let、var)
    不能以数字开头(比如 23d)
    ……

    展开全文
  • 文章目录推荐阅读基础语法快速浏览基础值类型转化控制流方法类和对象枚举和结构体协议和扩展错误...无需关心mian函数Swift项目中已经自动添加了全局的相关程序的入口,我们只需要在其他文件中编写hello world打印即可

    有些东西很简单,但是我还是把它记录了下来。

    推荐阅读

    the swift programming language swift 5.2

    Swift编程语言基础

    基础语法快速浏览

    基础

    • print
    print("Hello, world!")
    

    Swift打印使用print函数,无需导入单独的库来实现输入输出或字符串处理功能。

    • main()

    无需关心mian函数,Swift项目中已经自动添加了全局的相关程序的入口,我们只需要在其他文件中编写hello world打印即可。

    代码最后也不必须添加分号。

    • 变量常量

    var 声明一个变量

    let 声明一个常量,常量的只需赋值一次,可在多个地方使用。

    常量或变量的类型,必须要与值得类型相同。声明的时候不必须声明类型,在创建常量或变量时候给它一个值,可以让编译器推断其类型。

    例如:var number = 42; 声明一个整数类型的变量,编译器通过42,自动识别number的类型为整形。

    如果初始值不能明确的指出变量/常量类型,或者未给变量/常量赋值得话,需要在变量后面加冒号来指明变量的类型。

    例如:var score : Double = 70;

    值类型转化

    值不会隐式转换为其他类型,如果要转换,则需要将值创建为其他类型的实例

    let label = "The width is "
    let width = 94
    let widthLabel = label + String(width)
    

    反斜杠和括号搭配,可以在字符串中包含值。

    let apples = 3
    let oranges = 5
    let appleSummary = "I have \(apples) apples."
    let fruitSummary = "I have \(apples + oranges) pieces of fruit."
    
    

    如果是需要字符串多行输出,则使用 ‘’’’’’

    let quotation = """
    I said "I have \(4) apples.
    And then I said "I have \(5) pieces of fruit.
    """
    print(quotation);
    

    使用方括号[]来创建字典或数组,最后一个元素后面允许添加逗号

    var shoppingList = ["catfish", "water", "tulips"]   //便捷构造数组
    
    shoppingList[1] = "bottle of water"	// 给数组第一个元素赋值
    
    var occupations = [ "Malcolm": "Captain","Kaylee": "Mechanic",] // 便捷构造字典
    
    occupations["Jayne"] = "Public Relations" // 给key为Jayne的value赋值为Public Relations
    
    

    Swift中没有可变或者不可变数组的概念,数组随着添加元素而自动增长

    shoppingList.append("blue paint")
    
    

    如果创建一个空的数组/字典,请使用初始化方法

    let emptyArray = [String]()   // 初始化一个空数组,指定数组的元素类型为String类型
    
    let emptyDictionary = [String: Float]() // 初始化一个空字典,指定字典的key和value的类型分别是String和Float
    
    

    如果编译器可以推断出数据类型,则数组和字典的初始化也可以不指定相关的类型,但是这时候开发者需要注意一下,不能插入不同类型的数据。我不建议程序这样写,推荐初始化时指定相关类型。

    shoppingList = []
    occupations = [:]
    

    控制流

    if 、if else、switch、for in、for

    这些都大同小异…

    方法

    • func声明函数

    使用 func 来声明一个函数。通过函数名加上后面括号里的参数来调用函数,这个跟其他语言大差不离。

    // 声明并实现greet函数
    func greet(person: String, day: String) -> String { 
       return "Hello \(person), today is \(day)."
    }
    // 调用greet函数
    
    greet(person: "Bob", day: "Tuesday")
    

    person和day是两个形参,它们都是String类型的。-> 指明返回值是String类型。

    调用函数时,传入两个实参Bob和Tuesday。

    • 参数标签

    关于参数标签,对于开发者来说,个人感觉没什么卵用,这样设计的目的是什么呢?
    默认情况下,函数使用其参数名称作为其参数的标签。或者我们可以在在参数名称前写一个自定义参数标签。或者在参数名前加_表示不使用任何参数标签。

    • 使用元祖返回复合值

    如果一个函数需要多个返回值的话,使用元祖对返回值进行包装并返回。

    func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
        var min = scores[0]
        var max = scores[0]
        var sum = 0
        for score in scores {
            if score > max {
                max = score
            } else if score < min {
                min = score
            }
            sum += score
        }
        return (min, max, sum)
    }
    
    let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
    print(statistics.sum)
    // Prints "120"
    print(statistics.2)
    // Prints "120"
    
    • 函数嵌套

    即一个函数的实现里面,嵌套另一个函数。

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

    returnFifteen()中嵌套了一个add()函数及其实现。

    感觉这个功能还是挺好的。

    • 函数作为返回值
    func makeIncrementer() -> ((Int) -> Int) {
        func addOne(number: Int) -> Int {
            return 1 + number
        }
        return addOne
    }
    var increment = makeIncrementer()
    increment(7)
    

    目前不太清楚业务里应该怎么用,直接将一个函数作为返回值倒是很有趣的。

    • 函数作为参数
    // 这里定义了一个函数hasAnyMatches,传入参数是一个数组和一个函数,如果数组里的元素都满足condition这个函数的条件,则返回YES。
    func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    
        for item in list {
            if condition(item) {
                return true
            }
        }
        return false
    }
    // 这里定义了一个函数lessThanTen,功能是传入参数和10比较大小,如果比10小返回YES,否则返回NO。
    func lessThanTen(number: Int) -> Bool {
        return number < 10
    }
    // 定义一个数组
    var numbers = [20, 19, 7, 12]
    // 调用函数hasAnyMatches
    hasAnyMatches(list: numbers, condition: lessThanTen)
    

    hasAnyMatches()作为一个匹配数组numbers元素的函数,如果有一个元素满足lessThanTen()这个函数的条件,即其中任意一个元素小于10的话,直接返回true,否则匹配完,所有元素都大于或者等于10的话,返回false。

    类和对象

    • 声明一个类

    class 关键字声明类,在类中声明变量和函数的方法和前面的都一样。

    class Shape {
        var numberOfSides = 0
        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides."
        }
    }
    
    • 实例化类对象
    var shape = Shape()  // 初始化一个对象
    shape.numberOfSides = 7 // 给属性numberOfSides赋值
    var shapeDescription = shape.simpleDescription() // 调用方法
    

    以下写法和overwrite init()有什么区别?

    class NamedShape {
        var numberOfSides: Int = 0
        var name: String
        init(name: String) {
            self.name = name
        }
        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides."
        }
    }
    

    枚举和结构体

    定义一个枚举

    enum 枚举名:类型 {
     	case...
     	case...
    }
    

    Swift中枚举可以有与之相关联的方法。

    enum Rank: Int {
        case ace = 1
        case two, three, four, five, six, seven, eight, nine, ten
        case jack, queen, king
        // 这是定义在枚举中的一个函数
        func simpleDescription() -> String {
            switch self {
            case .ace:
                return "ace"
            case .jack:
                return "jack"
            case .queen:
                return "queen"
            case .king:
                return "king"
            default:
                return String(self.rawValue)
            }
        }
    }
    
    let ace = Rank.ace  // 获取枚举值
    let aceRawValue = ace.rawValue  // 获取枚举值对应的value
    let aceString = ace() // Rank.ace() 调用枚对应的函数
    
    

    这么看来定义一个枚举和定义一个类有点相似,可以定义方法。

    这里举了一个例子,枚举这么用的话让感觉特别棒

    enum ServerResponse {
        case result(String, String)
        case failure(String)
    }
    let success = ServerResponse.result("6:00 am", "8:09 pm")
    let failure = ServerResponse.failure("Out of cheese.")
    
    switch success {
    case let .result(sunrise, sunset):
        print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
    case let .failure(message):
        print("Failure...  \(message)")
    }
    

    定义一个结构体

    struct Card {
        var rank: Rank
        var suit: Suit
        func simpleDescription() -> String {
            return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
        }
    }
    
    let threeOfSpades = Card(rank: .three, suit: .spades)
    let threeOfSpadesDescription = threeOfSpades.simpleDescription()
    

    结构支持许多与类相同的行为,包括方法和初始化程序。
    结构和类之间最重要的区别之一是,结构在代码中传递时始终会被复制,而类是通过引用传递的。

    Runtime源码中我们可以看到类的定义其本质就是一个结构体,这个结构体中有成员变量,成员函数等。

    协议和扩展

    protocol定义:

    protocol ExampleProtocol {
        var simpleDescription: String { get }
        mutating func adjust()
    }
    

    类遵循协议

    class SimpleClass: ExampleProtocol {
        var simpleDescription: String = "A very simple class."
        var anotherProperty: Int = 69105
        // 实现协议方法
        func adjust() {
            simpleDescription += "  Now 100% adjusted."
        }
    }
    

    调用协议方法

    var a = SimpleClass()
    a.adjust()
    let aDescription = a.simpleDescription
    

    结构体遵循协议

    struct SimpleStructure: ExampleProtocol {
        var simpleDescription: String = "A simple structure"
        // 结构体中实现协议方法
        mutating func adjust() {
            simpleDescription += " (adjusted)"
        }
    }
    
    var b = SimpleStructure()
    b.adjust()
    let bDescription = b.simpleDescription
    

    用于extension向现有类型添加功能

    extension Int: ExampleProtocol {
        var simpleDescription: String {
            return "The number \(self)"
        }
        mutating func adjust() {
            self += 42
        }
    }
    print(7.simpleDescription)
    

    错误处理

    • do- catch
    do {
        let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
        print(printerResponse)
    } catch {
        print(error)
    }
    
    
    • try?
    let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
    

    有点像三目运算,将结果转换为可选的。

    *defer

    泛型

    展开全文
  • 利用atexit()函数可以在程序终止前完成一些“清理”工作——如果将指向一组函数的指针传递给atexit()函数,那么在程序退出main()函数后(此时程序还未终止)就能自动调用这组函数。在使用atexit()函数时你要注意这样两...
  • Swift(一)

    2014-08-11 18:12:02
    // mian函数作为主入口 此函数木有 // 输出自动换行 import Foundation println("Hello, World!") println("输出需要加双引号") // Swift语句后面没有分号,但是可以使用 // ...
  • Swift 编写的一个 ToDo App,想要实现的功能是:TableView 上可以增加待做选项,并按照时间先后排序,可以实现删除,到点通知功能。
  • App启动时间,直接影响用户对app的第一体验和判断.如果启动时间过长,不单用户体验会下降, ...二: main函数开始到 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOpt
  • 本文字数:6139字预计阅读时间:16分钟前言随着Swift5.0版本release之后,abi也变得逐渐稳定起来,加上Swift语法简洁、安全、语法糖丰富等特性,越来越多的开发者们...
  • App 启动时间过长,可能有多个原因造成的,从理论上说App的启动时间是由mian()函数之前的加载时间(t1)和mian函数之后的加载时间(t2)组成的 关于t1 需要分析App 启动日志,具体方法是在Xcode 添加 DYLD_PRINT_...
  • 打开Xcode,本次学习的Xcode版本是6.2 打开Xcode,会出现以下界面 Get started with a playground:创建一个playground单元,它能让你快速体验到playground的特性。 Create a new Xcode project:创建一个Xcode工程,...
  • Xcode程序入口

    2015-08-31 18:09:37
    Xcode4.2之前的main函数如下: int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]
  • 02-函数重载

    2019-02-15 11:53:35
    写在前面 作为移动端的开发语言,新秀们是支持运算符重载的,老一辈语言是不支持的。先透漏一点。 /* C语言不支持运算符重载 java中确实没有云运算符重载,... swift 支持运算符重载 kotlin 支持运算符重载 C+...
  • Scala(二) 基础语法

    2019-03-28 20:14:03
    一 创建Main类 右键src/main/scala ->...Scala对比与一下Java,给人的感觉就是换了一种书写形式而已,Scala使用def关键字来定义方法,就像Javascript使用function关键字来定义函数一样,都是用一...
  • 在我们iOS的开发过程中,可能会需要把系统自带的Main.storyboard删掉自己纯代码去创建需要的界面等,但是有时候却发现删掉之后运行模拟器出来的 界面还是一片漆黑,很多人可能就是忽略了这么一个细节,下面我截图以说明...
  • Swift 书面 ToDo App

    2019-07-11 00:00:25
    下面的代码是使用的全部XcodeVersion 6.0.1 (6A317)书面。 因为当使用团队开发stroyboard在并购的诸多不便的时间,所有或使用.xib该文件准备ToDo App. 想要实现的功能:TableView 够添加待做选项。...
  • 来源:xxyyxx基本大纲应用的启动分为Pre-main和mian两部分在Pre-main中,可以大致分为load dylib->rebase->bind->Objc setup-> initializer,开发能掌握和度量的是initializer部分在开发阶段(Xcode)如何查看启动的每...
  • 虽然swift已经推出但是一直做的是网页端和windows上软件的开发并未接触移动端开发...mian.m函数为程序入口-》执行UIApplicationMain函数(开启消息循环,同时传入delegate)-》当程序状态发生改变的时候调用delegate
1 2 3 4
收藏数 71
精华内容 28
关键字:

mian函数 swift