swift 下 init()与init?()区别

 swift  swift 下 init()与init?()区别已关闭评论
12月 252019
 

swift 的类代码里,init()是正常初始化类,但如果初始数据不满足要求,或需要返回nil时,怎么处理呢? init?()就是派这个用场地!

引用https://www.hackingwithswift.com/example-code/language/whats-the-difference-between-init-and-init的内容,下面说的很详细,也有例子举例,大家一看就明白:

It’s the job of a regular Swift initializer to create a fully fledged instance of a new type, however sometimes the data that has been provided is insufficient or incorrect, and creation can’t proceed.

For example, consider this code:

struct Person {
    var ssn: String

    init(socialSecurityNumber: String) {
        self.ssn = socialSecurityNumber
    }
}

let person = Person(socialSecurityNumber: "111-11-1111")
print(person)

That defines a Person struct that can be created using a nine-digit social security number, then creates an instance of that struct.

But what should happen here?

let person = Person(socialSecurityNumber: "FISH")

In that instance we’re passing an invalid social security number, so really we expect creating a Person to fail.

This is where failable initializers come in: they are written as init?(), and can return nil rather than a value if something goes wrong during creation. For example, we could write a quick check to make sure the social security number is more or less correct like this:

struct Person {
    var ssn: String

    init?(socialSecurityNumber: String) {
        if socialSecurityNumber.count < 11 {
            return nil
        } else {
            self.ssn = socialSecurityNumber
        }
    }
}

Notice the initializer is now called init?() to reflect that it returns an optional – the process might return nil if the creation fails. The logic is pretty simple: if there are 11 digits we assume it’s correct, otherwise we return nil. Note: if you really wanted to validate that number you’d need to use a regular expression.

git创建新项目(含从已有版本文件创建)

 git  git创建新项目(含从已有版本文件创建)已关闭评论
11月 262013
 

摘录自:http://www.worldhello.net/gotgithub/03-project-hosting/010-new-project.html

创建新项目

1.1. 新版本库即是新项目

在GitHub,一个项目对应唯一的Git版本库,创建一个新的版本库就是创建一个新的项目。访问仪表板(Dashboard)页面,如图3-1,可以看到关注的版本库中已经有一个,但自己的版本库为零。在显示为零的版本库列表面板中有一个按钮“New Repository”,点击该按钮开始创建新版本库。

../images/new-repo-btn.png

图3-1:版本库列表面板

新建版本库的界面如图3-2所示。

../images/new-project.png

图3-2:创建新项目

我们为新建立的版本库命名为“helloworld”,相应的项目名亦为“helloworld”,创建完毕后访问项目页,提示版本库尚未初始化,并给出如何初始化版本库的帮助,如图3-3所示。

../images/project-uninitial.png

图3-3:项目尚未初始化

在图3-3中可以看到访问协议增加了一个支持读写的SSH协议,访问地址为:[email protected]:gotgithub/helloworld.git。注意任何GitHub用户均可使用该URL访问此公开版本库,但只有版本库建立者gotgithub具有读写权限,其他人只有只读权限。在初始化版本库之前,最好先确认是否是用正确的公钥进行认证,如下:

$ ssh -T [email protected]
Hi gotgithub! You've successfully authenticated, but GitHub does not provide shell access.

1.2. 版本库初始化

如果是从头创建版本库,可以采用先克隆,建立提交数据,最后再通过推送完成GitHub版本库的初始化。步骤如下:

  • 克隆版本库。

    克隆过程会显示警告,不过这个警告可以忽略,因为GitHub创建的版本库本来就是一个空白的版本库。

    $ git clone [email protected]:gotgithub/helloworld.git
    Cloning into 'helloworld'...
    warning: You appear to have cloned an empty repository.

  • 创建文件README.md[1]

    下面是一段示例文字,把这段文字保存为文件README.md,该文件的内容将会直接显示在项目首页中(显示效果参见后面的图3-5)。

    # 我的第一个GitHub项目
    
    这是项目 [helloworld](https://github.com/gotgithub/helloworld) ,
    欢迎访问。
    
    这个项目的版本库是 **Git格式** ,在 Windows、Linux、Mac OS X
    平台都有客户端工具可以访问。虽然版本库只提供Git一种格式,
    但是你还是可以用其他用其他工具访问,如 ``svn`` 和 ``hg`` 。
    
    ## 版本库地址
    
    支持三种访问协议:
    
    * HTTP协议: `https://github.com/gotgithub/helloworld.git` 。
    * Git协议: `git://github.com/gotgithub/helloworld.git` 。
    * SSH协议: `ssh://[email protected]/gotgithub/helloworld.git` 。
    
    ## 克隆版本库
    
    操作示例:
    
        $ git clone git://github.com/gotgithub/helloworld.git

    上面这段文字采用Markdown格式,您也可以使用其他支持的格式,只要确保README文件使用正确的扩展名。本书附录部分介绍了Markdown及其他GitHub支持的标记语言。关于Markdown,目前我们只需知道这一个易于识别和理解的纯文本格式,可以方便的转换为HTML。Markdown语法非常像我们在写邮件(纯文本)时用空行来分隔段落、用星号开启列表、用缩进表示引用内容等等。

  • 添加README.md文件并提交。

    $ git add README.md
    $ git commit -m "README for this project."

  • 向GitHub推送,完成版本库初始化。

    $ git push origin master

然后查看GitHub上新建项目的首页。项目首页的上半部分可见版本库包含了一个新的提交,以及版本库目录树中包含的文件,如图3-4所示。

../images/project-pushed-head.png

图3-4:完成推送后的项目首页上半部分

在项目首页的下半部分,会看到README.md文件被转换为HTML显示,如图3-5所示。

../images/project-pushed-tail.png

图3-5:完成推送后的项目首页下半部分

1.3. 从已有版本库创建

如果在GitHub项目初始化之前,数据已经存在于本地版本库中,显然像上面那样先克隆、再提交、后推送的方法就不适宜了。应该采用下面的方法。

为试验新的版本库初始化方法,先把刚刚新建的测试项目“helloworld”删除,同时也将本地工作区中克隆的“helloworld”删除。警告:删除项目的操作非常危险,不可恢复,慎用。

  • 点击项目首页中项目名称旁边的“Admin”按钮进入项目管理页,再点击页面最下方的删除版本按钮,如图3-6所示。

    ../images/project-delete.png

    图3-6:删除项目

  • 然后再重建版本库“helloworld”,如本章一开始图3-2所示。

接下来使用下面的步骤完成“helloworld”版本库的初始化。

  • 本地建立一个Git版本库。

    $ mkdir helloworld
    $ cd helloworld
    $ git init

  • 然后在版本库中添加示例文件,如README.md文件,内容同前。

    $ git add README.md
    $ git commit -m "README for this project."

  • 为版本库添加名为origin的远程版本库。

    $ git remote add origin [email protected]:gotgithub/helloworld.git

  • 执行推送命令,完成GitHub版本库的初始化。注意命令行中的-u参数,在推送成功后自动建立本地分支与远程版本库分支的追踪。

    $ git push -u origin master


[1] 以扩展名.md.mkd.mkdn.mdown.markdown等为结尾的文件,均以Markdown标记语言语法进行解析并显示。