swift文档_最新 swift ios 开发文档 官方文档 - CSDN
  • swift4官方文档中文版

    2018-08-01 10:33:34
    该文章翻译自Apple官方文档: The Swift 4 Programming Language Guards翻译组 正在翻译Swift 4的全套文档, 这是该文档第一章节的上半部分, 下半部分我们将于明天下午发布. 如果你感兴趣, 可以关注我们的简书. 原文...

    该文章翻译自Apple官方文档: The Swift 4 Programming Language

    Guards翻译组 正在翻译Swift 4的全套文档, 这是该文档第一章节的上半部分, 下半部分我们将于明天下午发布. 如果你感兴趣, 可以关注我们的简书.
    原文链接: The Basics

    Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。即便如此,如果你有 C 或者 Objective-C 开发经验,你会发现 Swift 的有很多你熟悉的内容。Swift 提供了与 C 和 Objective-C 上所有基础数据类型,如整型Int; 浮点型Double和Float; 布尔型值Bool;文本型数据String 。 Swift 还提供了三个基本的集合类型,Array ,Set和 Dictionary ,详见集合类型。

    和 C 语言类似,Swift 使用变量来进行存储并通过变量名来关联对应的值。在 Swift 中,不可变的变量非常常用,它们就是常量,而且比 C 语言的常量更强大。在 Swift 中,如果你要处理的值不需要改变,那使用常量可以让你的代码更加安全并且更清晰地表达你的意图。

    除了我们熟悉的类型,Swift 还增加了 Objective-C 中没有的高阶数据类型, 比如元组Tuples。元组可以让你创建或者传递一组数据,当函数需要返回单一复合值时,你可以用一个元组可以返回多个值。

    Swift 还增加了Optional类型(译者注: Optional类型即可选类型),用于处理值不存在的情况。可选的意思是 “这里有一个值,并且它等于x ” 或 “这里没有值” 。可选有点像在 Objective-C 中使用nil ,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的 nil指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
    Swift 是一门类型安全的语言,这意味着 Swift 可以让你清楚地知道值的类型。如果你的代码期望得到一个String ,类型安全会阻止你错误地传入一个Int。同样的,如果你的代码期望得到一个 String,类型安全会阻止你意外传入一个可选的 String 。类型安全可以帮助你在开发阶段尽早发现并修正错误。

    常量和变量

    常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者 welcomeMessage)和一个指定类型的值(比如数字 10或者字符串”Hello”)关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。

    声明常量和变量

    常量和变量必须在使用前声明,用 关键字let来声明常量和关键字 var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试登录的次数:

      let maximumNumberOfLoginAttempts = 10
      var currentLoginAttempt = 0

    这两行代码可以被理解为:
    “声明一个名字是maximumNumberOfLoginAttempts的新常量,并给它一个值 10。然后,声明一个名字是currentLoginAttempt的变量并将它的值初始化为0 ”。

    在这个例子中,允许的最大尝试登录次数被声明为一个常量,因为这个值不会改变。当前尝试登录次数被声明为一个变量,因为每次尝试登录失败的时候都需要增加这个值。
    你可以在一行中声明多个常量或者多个变量,用逗号隔开:

      var x = 0.0, y = 0.0, z = 0.0

    Note:如果你的代码中有不需要改变的值,请使用 let 关键字将它声明为常量。只将需要改变的值声明为变量。

    类型标注

    当你声明常量或者变量的时候可以加上 类型标注 (type annotation),说明常量或者变量中要存储的值的类型。通过在常量或变量名后面接一个冒号来写一个类型标注,后跟一个空格,后跟要使用的类型的名称。

    这个例子给welcomeMessage 变量添加了类型标注,表示这个变量可以存储 String类型的值:

       var welcomeMessage: String

    声明中的冒号代表着“xx是xx类型”,所以这行代码可以被理解为:

    声明一个类型为 String,名字为welcomeMessage的变量。
    类型为 String ”的意思是“可以存储任意 String 类型的值。

    welcomeMessage 变量现在可以被正确地设置成任意字符串:

      welcomeMessage = "Hello"

    你可以在一行中定义多个同样类型的变量,用逗号分割,并在最后一个变量名之后添加类型标注:

      var red, green, blue: Double

    Note:一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型,请参考类型安全和类型推断。在上面的例子中,没有给 welcomeMessage
    赋初始值,所以变量 welcomeMessage
    的类型是通过一个类型标注指定的,而不是通过初始值推断的。
    常量和变量的命名

    你可以用任何你喜欢的字符作为常量和变量名,包括 Unicode 字符:

    let π = 3.14159
    let 你好 = "你好世界"
    let  = "dogcow"

    常量与变量名不能包含空格,数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
    一旦你将常量或者变量声明为确定的类型,你就不能使用相同的名字再次进行声明,或者改变其存储的值的类型。同时,你也不能将常量与变量进行互转。

    Note:如果你需要使用与Swift保留关键字相同的名称作为常量或者变量名,你可以使用反引号(`)将关键字包围的方式将其作为名字使用。无论如何,你应当避免使用关键字作为常量或变量名,除非你别无选择。
    你可以更改现有的变量值为其他同类型的值,在下面的例子中,friendlyWelcome的值从”Hello!”改为了”Bonjour!”:

    var friendlyWelcome = "Hello!"
    friendlyWelcome = "Bonjour!"
    // friendlyWelcome 现在是 "Bonjour!"

    与变量不同,常量的值一旦被确定就不能更改了。尝试这样做会导致编译时报错:

    let languageName = "Swift"
    languageName = "Swift++"
    // 这会报编译时错误 - languageName 不可改变

    输出常量和变量

    你可以用print(_:separator:terminator:)
    函数来输出当前常量或变量的值:

    print(friendlyWelcome)// 输出 "Bonjour!"

    print(:separator:terminator:)是一个用来输出一个或多个值到适当输出区的全局函数。在 Xcode中,print(:separator:terminator:)将会输出内容到“console”面板上。separator和 terminator参数具有默认值,因此你调用这个函数的时候可以忽略它们。默认情况下,该函数通过添加换行符来结束当前行。如果不想换行,可以传递一个空字符串给 terminator 参数–例如,print(someValue, terminator:”“)
    。关于参数默认值的更多信息,请参考默认参数值。

    Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

    print("The current value of friendlyWelcome is \(friendlyWelcome)")
    // 输出 "The current value of friendlyWelcome is Bonjour!

    Note:字符串插值所有可用的选项,请参考字符串插值。
    注释

    请将你的代码中的非执行文本注释成提示或者笔记以方便你将来阅读。Swift 的编译器将会在编译代码时自动忽略掉注释部分。
    Swift 中的注释与 C 语言的注释非常相似。单行注释以双正斜杠 (//)
    作为起始标记:

      // 这是一个注释
      ```
    行注释的起始标记为单个正斜杠后跟随一个星号(/*),终止标记为一个星号后跟随单个正斜杠(*/):

    /* 这是一个,多行注释 */

    C 语言多行注释不同,Swift 的多行注释可以嵌套在其它的多行注释之中。你可以先生成一个多行注释块,然后在这个注释块之中再嵌套成第二个多行注释。终止注释时先插入第二个注释块的终止标记,然后再插入第一个注释块的终止标记:
    

    /* 这是第一个多行注释的开头
    /* 这是第二个被嵌套的多行注释 */
    这是第一个多行注释的结尾 */

    
    通过运用嵌套多行注释,你可以方便快速的注释掉一大段代码,即使这段代码之中已经含有了多行注释块。
    
    #### 分号
    
    与其他大部分编程语言不同,Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:

    let cat = “”;
    print(cat)// 输出 “”

    #### 整数
    
    整数就是没有小数部分的数字,比如 42和 -23 。整数可以是 有符号(正数、零和负数)或者无符号(正数、零)。
    Swift 提供了8163264位的有符号和无符号整数类型。这些整数类型和 C 语言的命名方式很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是Int32。就像 Swift 的其他类型一样,整数类型采用大写命名法。
    
    #### 整数范围
    
    你可以访问不同整数类型的 minmax 属性来获取对应类型的最小值和最大值:

    let minValue = UInt8.min // minValue 为 0,是 UInt8 类型
    let maxValue = UInt8.max // maxValue 为 255,是 UInt8 类型

    这些属性的值具有适当大小的数字类型(例如上例中的UInt8),因此可以与表达式一起使用同一类型的其他值。
    
    #### Int
    
    大多数情况下,你不需要专门指定整数的长度。Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:
    
    在32位平台上,Int和 Int32长度相同。
    在64位平台上,Int和 Int64长度相同。
    除非你需要特定长度的整数,一般来说使用 Int就够了。这可以提高代码一致性和可复用性。即使是在32位平台上,Int 可以存储的整数范围也可以达到 -2,147,483,648 ~ 2,147,483,647,大多数时候这已经足够大了。
    
    #### UInt
    
    Swift 也提供了一个特殊的无符号类型 UInt,长度与当前平台的原生字长相同:
    
    在32位平台上,UInt 和 UInt32长度相同。
    在64位平台上,UInt 和 UInt64长度相同。
    Note:尽量不要使用UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使你要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考类型安全和类型推断。
    ##### 浮点数
    
    浮点数是有小数部分的数字,比如 3.141590.1 和 -273.15。
    浮点类型比整数类型表示的范围更广,可以存储比Int
    类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:
    
    Double表示64位浮点数。
    Float表示32位浮点数。
    Note:Double精确度很高,至少有15位数字,而Float只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围,在两种类型都可以选择的情况下,将优先选择 Double。
    ##### 类型安全和类型推断
    
    Swift 是一个类型安全(type-safe)的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个String,你绝对不可能错误地传进去一个Int。
    
    由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
    
    当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。
    
    因为有了类型推断,和 C 或者 Objective-C 比起来 Swift 很少需要声明类型。常量和变量虽然需要明确类型,但是大部分工作并不需要你自己来完成。
    
    当你声明常量或者变量并赋初值的时候类型推断非常有用。当你在声明常量或者变量的时候赋给它们一个确定值(literal value 或 literal)即可触发类型推断。(字面量就是会直接出现在你代码中的值,比如 423.14159。)
    例如,如果你给一个新常量赋值42并且没有标明类型,Swift 可以推断出常量类型是 Int,因为你给它赋的初始值看起来像一个整数:

    let meaningOfLife = 42// meaningOfLife 会被推测为 Int 类型

    同理,如果你没有给浮点数标明类型,Swift 会推断你想要的是Double

    let pi = 3.14159// pi 会被推测为 Double 类型

    当推断浮点数的类型时,Swift 总是会优先选择 Double而不是Float。如果表达式中同时出现了整数和浮点数,会被推断为 Double
    类型:

    let anotherPi = 3 + 0.14159 // anotherPi 会被推测为 Double 类型

    原始值3 没有显式声明类型,而表达式中出现了一个浮点数,所以表达式会被推断为 Double类型。
    
    #### 数值型字面量
    
    整数字面量可以被写作:
    
    一个十进制数,没有前缀
    一个二进制数,前缀是0b
    一个八进制数,前缀是0o
    一个十六进制数,前缀是0x
    下面的所有整数字面量的十进制值都是17

    let decimalInteger = 17
    let binaryInteger = 0b10001 // 二进制的17
    let octalInteger = 0o21 // 八进制的17
    let hexadecimalInteger = 0x11 // 十六进制的17

    浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是 0x )。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。十进制浮点数也可以有一个可选的指数(exponent),通过大写或者小写的 e来指定;十六进制浮点数必须有一个指数,通过大写或者小写的 p来指定。如果一个十进制数的指数为 exp,那这个数相当于基数和10^exp的乘积:

    1.25e2 表示 1.25 × 10^2,等于 125.0。
    1.25e-2 表示 1.25 × 10^-2,等于 0.0125。

    如果一个十六进制数的指数为exp,那这个数相当于基数和2^exp的乘积:

    0xFp2 表示 15 × 2^2,等于 60.0。
    0xFp-2 表示 15 × 2^-2,等于 3.75。

    下面的这些浮点字面量都等于十进制的12.1875:

    let decimalDouble = 12.1875
    let exponentDouble = 1.21875e1
    let hexadecimalDouble = 0xC.3p0

    数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:

    let paddedDouble = 000123.456
    let oneMillion = 1_000_000
    let justOverOneMillion = 1_000_000.000_000_1

    #### 数值型类型转换
    
    通常来讲,即使代码中的整数常量和变量已知非负,也请使用Int类型。总是使用默认的整数类型可以保证你的整数常量和变量可以直接被复用并且可以匹配整数类字面量的类型推断。
    
    只有在必要的时候才使用其他整数类型,比如要处理外部的长度明确的数据或者为了优化性能、内存占用等等。使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理特殊数据。
    
    ##### 整数转换
    
    不同整数类型的变量和常量可以存储不同范围的数字。Int8类型的常量或者变量可以存储的数字范围是-128~127,而UInt8类型的常量或者变量能存储的数字范围是0~255。如果数字超出了常量或者变量可存储的范围,编译的时候会报错:

    let cannotBeNegative: UInt8 = -1// UInt8 类型不能存储负数,所以会报错
    let tooBig: Int8 = Int8.max + 1// Int8 类型不能存储超过最大值的数,所以会报错

    由于每种整数类型都可以存储不同范围的值,所以你必须根据不同情况选择性使用数值型类型转换。这种选择性使用的方式,可以预防隐式转换的错误并让你的代码中的类型转换意图变得清晰。
    
    为了将一种数字类型转换成另一种,你要用当前值来初始化一个期望类型的新数字,这个数字的类型就是你的目标类型。在下面的例子中,常量twoThousand是UInt16类型,然而常量one是UInt8类型。它们不能直接相加,因为它们类型不同。所以要调用UInt16(one)来创建一个新的UInt16数字并用one的值来初始化,然后使用这个新数字来计算:

    let twoThousand: UInt16 = 2_000
    let one: UInt8 = 1
    let twoThousandAndOne = twoThousand + UInt16(one)
    “`
    现在两个数字的类型都是 UInt16,可以进行相加。输出常量 twoThousandAndOne 的类型被推断为 UInt16,因为它是两个 UInt16值的和。

    SomeType(ofInitialValue)是调用Swift类型的初始化器并传入初始值的默认方式。
    在语言内部,UInt16有接受一个UInt8的值,这个初始化器用来从现有的UInt8中创建一个新的UInt16。然而,你并不能传入任意类型的值,只能传入UInt16类型的值。不过你可以扩展现有的类型来让它可以接收其他类型的值(包括自定义类型),请参考扩展。

    整数和浮点数转换

    整数和浮点数的转换必须显式指定类型:

    let three = 3let pointOneFourOneFiveNine = 0.14159
    let pi = Double(three) + pointOneFourOneFiveNine // pi 等于 3.14159,所以被推测为 Double 类型
    这个例子中,常量 three的值被用来创建一个Double类型的值,所以加号两边的数类型须相同。如果不进行转换,两者无法相加。浮点数到整数的反向转换同样行,整数类型可以用` Double 或者Float类型来初始化:

    let integerPi = Int(pi)// integerPi 等于 3,所以被推测为 Int 类型
    当用浮点类型来初始化一个新的整数值时,浮点值会被截断。也就是说 4.75会变成 4,-3.9会变成 -3。

    Note:结合数字类常量和变量不同于结合数字类字面量。字面量3可以直接和字面量0.14159相加,因为数字字面量本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。

    类型别名

    类型别名type aliases就是给现有类型定义另一个名字。你可以使用typealias关键字来定义类型别名。

    当你想要给现有类型起一个更合适的名字时,类型别名非常有用。比如你正在处理特定长度的外部资源的数据:

    typealias AudioSample = UInt16

    定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名:

    var maxAmplitudeFound = AudioSample.min// maxAmplitudeFound 现在是 0

    本例中,AudioSample被定义为UInt16的一个别名。因为它是别名,AudioSample.min实际上是UInt16.min,所以会给maxAmplitudeFound赋一个初值0。

    布尔值

    Swift 有一个基本的布尔Boolean类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true和false:

    let orangesAreOrange = truelet
    turnipsAreDelicious = false

    orangesAreOrange和turnipsAreDelicious 的类型会被推断为 Bool,因为它们的初值是布尔字面量。就像之前提到的 Int 和 Double一样,如果创建变量的时候给它们赋值 true或者false,那你不需要将常量或者变量声明为Bool类型。初始化常量或者变量的时候如果所赋的值类型已知,就可以触发类型推断,这让 Swift 代码更加简洁并且可读性更高。当你编写条件语句比如 if 语句的时候,布尔值非常有用:

    if turnipsAreDelicious {
         print("Mmm, tasty turnips!")
    } else {
         print("Eww, turnips are horrible.")
    }

    // 输出 “Eww, turnips are horrible.”
    条件语句,例如if,请参考控制流。

    如果你在需要使用 Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错。下面的例子会报告一个编译时错误:

    let i = 1if i { // 这个例子不会通过编译,会报错}

    然而,下面的例子是合法的:

    let i = 1
    if i == 1 {
        // 这个例子会编译成功
    }

    i == 1 的比较结果是 Bool类型,所以第二个例子可以通过类型检查。类似i ==1这样的比较,请参考基本操作符。和 Swift 中的其他类型安全的例子一样,这个方法可以避免错误,并确保特定代码的意图总是清晰的。

    元组

    元组tuples把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

    下面这个例子中,(404, “Not Found”)是一个描述 HTTP 状态码HTTP status code的元组。HTTP 状态码是当你请求网页的时候 web 服务器返回的一个特定值。如果你请求的网页不存在就会返回一个 404 Not Found 状态码。

    let http404Error = (404, "Not Found")
    // http404Error 的类型是 (Int, String),值是 (404, "Not Found")

    404, “Not Found”元组把一个 Int 值和一个String值组合起来表示HTTP状态码的两个部分:一个数字和一个人类可读的描述。这个元组被定义为“一个类型为 (Int, String)的元组”。
    你可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。你可以创建任何一个类型为(Int, Int, Int)或者 (String, Bool) 或者其他任何你想要的组合的元组。你可以将一个元组内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:

    let (statusCode, statusMessage) = http404Error
    print("The status code is \(statusCode)")
    // 输出 "The status code is 404"
    print("The status message is \(statusMessage)")
    // 输出 "The status message is Not Found"

    如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_
    )表示:

    let (justTheStatusCode, \_) = http404Error
    print("The status code is \(justTheStatusCode)")
    // 输出 "The status code is 404"
    

    此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:

    print("The status code is \(http404Error.0)")
    // 输出 "The status code is 404"
    print("The status message is \(http404Error.≥   1)")
    // 输出 "The status message is Not Found"

    你可以在定义元组的时候给单个元素命名:

    let http200Status = (statusCode: 200, description: "OK")

    给元组中的元素命名后,你可以通过名字来获取这些元素的值:

    print("The status code is \(http200Status.statusCode)")
    // 输出 "The status code is 200"
    print("The status message is \(http200Status.description)")
    // 输出 "The status message is OK"

    作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个(Int, String) 元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。请参考函数参数与返回值。

    Note:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。请参考类和结构体。
    The Basics 上半部分完结, 下半部分我们将于明天下午发布.

    展开全文
  • /Users/yangyangzi/Desktop/YangZi2/swift/swiftUI-官方文档-学完js再 回来学/SwiftUI.rtf (公司电脑) 学习教程:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views 一、创建和...

    /Users/yangyangzi/Desktop/YangZi2/swift/swiftUI-官方文档-学完js再 回来学/SwiftUI.rtf (公司电脑)

    学习教程:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

     

    一、创建和组合视图

    6.26:需要用Catalina  macOS 10.15 beta 10.15的系统才能看到swiftUI的cavans:https://www.v2ex.com/t/573019

    6.27:

    1节:创建一个新项目并探索画布

    安装好Mac系统10.15后,cavas依旧不能显示,报错failed to build ContentView.swift,点击Diagnostics,具体问题如下:

     

    invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

     

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

     

    failedToCodeSign: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

    /Users/yangyangzi/Library/Developer/Xcode/DerivedData/CreatingAndCombiningViews-ftgpsvdswgizgqgyfzdaoirbhbey/Build/Intermediates.noindex/Previews/Landmarks/Intermediates.noindex/CreatingAndCombiningViews.build/Debug-iphonesimulator/Landmarks.build/Objects-normal/x86_64/ContentView.2.preview-thunk.dylib: the codesign_allocate helper tool cannot be found or used

     

    尝试一:

    安装命令行开发工具Xcode  command line tools

    https://blog.csdn.net/CHENYUFENG1991/article/details/47007979

    Command line tools(Xcode命令行工具)作用:可以写c语言程序;建立文件夹;建项目等

    此方法有效:安装好xcode命令行工具,再点击画布的resume,画布就能正常展示了

    https://cloud.tencent.com/developer/ask/222081 虽然没直接帮我解决问题,此回答还是略有启发的

     

    6.28

    第2节:自定义文本视图

    源编辑器;画布;检查器

     

    第3节:使用堆栈组合视图

    VStack

    HStack

    嵌入Stack;向此Stack中拖控件;Stack内视图的对齐;此stack中的某视图再嵌入个StackTwo;向此StackTwo中拖控件;StackTwo的两个控件添加Spacer;用padding()填充留边

    (这个Stack的操作特别像安卓的各种layout;swiftUI特别像安卓的xml文件)

     

    Xcode的结构化编辑支持,embed in stack

     

    第4节:创建自定义图像视图

    Image("home_usercenter")

     

    形状:

    .clipShape(Circle())

     

    添加叠加层即边框:

    .overlay(Circle().stroke(Color.gray, lineWidth: 4))

     

    添加阴影:

    .shadow(radius: 10)

     

    第5节:一起使用UIKit和SwiftUI视图

    实时预览

     

    第6节:撰写详细信息视图

     

     

    二、建立列表和导航

    第1节:了解样本数据

    第2节:创建行视图

     

    7.1

    每次新创建的SwiftUI文件,都默认有两个结构体

    第3节:自定义行预览

    第4节:创建地标列表

    第5节:使列表动态化

    1、identified(by:)使用唯一标识每个元素的属性的键路径调用方法,或者使数据类型符合Identifiable协议。

    2、Identifiable协议

    第6节:在列表和详细信息之间设置导航

    List{ }

    第7节:将数据传递到子视图

    第8节:动态生成预览 (同时查看不同设备的画布;您可以尝试使用不同的设备来比较视图的渲染,所有这些都来自画布)

    .previewDevice(PreviewDevice(rawValue:

    struct LandmarkList_Previews : PreviewProvider {

        static var previews: some View {

            LandmarkList().previewDevice(PreviewDevice(rawValue: "iPhone XS"))

        }

    }

    forEach

    //        ForEach以与列表相同的方式对集合进行操作,这意味着您可以在任何可以使用子视图的位置使用它,例如在堆栈,列表,组等中。当数据元素是简单的值类型(如您在此处使用的字符串)时,您可以将其\.self用作标识符的关键路径

            ForEach(["iPhone SE", "iPhone XS Max"].identified(by: \.self)){

                deviceName in

            LandmarkList().previewDevice(PreviewDevice(rawValue: deviceName))

            }

    Group:您可以使用组和堆栈来组织视图和其他内容,但不能直接从没有此处列出的其他类型的集合中使用。

    ForEach:将实例放在一个或其他容器类型中以创建动态列表。ForEachList

    您可以ListIdentifiable元素集合中创建视图。您使用什么方法来调整不符合Identifiable协议的元素集合?

    func identified(by:)  即将密钥路径传递给集合的元素的唯一标识属性到该identified(by:)方法。

     

    NavigationView:列表及其子项设置导航层次结构,但是您需要使用不同的类型来使行充当导航到另一个视图的按钮。

    创建List可导航的行以导航到另一个视图:在声明时,提供目标视图和行的内容。NavigationButton

     

    三、处理用户输入

    forEach

    第1节:标记用户喜欢的地标

    Image(systemName: "star.fill").imageScale(.medium)

     

    第2节:过滤列表视图

    @State:状态是一个值或一组值,它们可以随时间变化,并且会影响视图的行为,内容或布局,@State属性的属性将状态添加到视图。

    SwiftUI 用 @State 来维护状态,状态改变后,会自动更新 UI。类似的语法还有 @Binding,@@Environment 等。

    @State 修饰的状态发生改变,SwiftUI 会再次调用 body, 处理界面的更新。这些具体实现都可以隐藏到 State的 value 读写当中

    第3节:添加控件以切换状态

     

    swiftUI的DSL语法:https://mp.weixin.qq.com/s/-LhgGUJs4PppOJ-0-9VRPA

    1、省略 return:单语句才会省略

    2、属性(Attribute)

    Attribute 是指 @ 字符开头的,类似 @available 这种语法;

    Swift 的 Attribute 语法可以放到类型定义或者函数定义的前面,是对类型和函数的一种标记。

    下面大致描述 Attribute 的原理,具体的实现细节可能会有出入。

    编译 Swift 源代码时,在解析阶段(Prase), 会生成一个抽象语法树(AST,Abstract Syntax Tree)。语法树生成时,所有的 Attribute 统一处理,生成 Attribute 节点。之后在语义分析阶段(semantic analysis),会有可能触发 Attribute 节点,使其对语法树本身产生影响。

    不同的 Attribute 对语法树可以有不同的影响。比如 @available 会根据系统对语法树的函数调用进行可行性检查,不修改语法树本身。而 @dynamicMemberLookup,@dynamicCallable 进行检查后,可能会直接修改语法树本身,从而转调某些根据规则命名好的类或者函数。

    Attribute 是种元编程(Metaprogramming)手段,Attribute 语法会被编译成语法树节点,而 Attribute 又可以反过来修改语法树本身。在类定义或函数定义前添加不同的 Attribute,可以不同的方式修改语法树,从而实现某些常规方式难以实现的语法。其实很好理解,既然都可以修改语法树了,自然就可以通过 Attribute 实现神奇的语法。

    假如修改 Swift 的源码,可以根据不同的场合,很容易添加自定义 Attribute。比如 @UIApplicationMain 就是一个自定义 Attribute 扩展,为语法树添加了入口 main 函数。因而用 swift 写 iOS App, 是不用自己写 main 函数的。

    @StateSwiftUI 用 @State 来维护状态,状态改变后,会自动更新 UI。类似的语法还有 @Binding,@Environment 等。

    这个语法特性看起来很神奇,叫 Property Delegates[4]。

    State 其实只是个自定义类,用 @propertyDelegate 修饰,将 zoomed 的读写转到 State 实现了。其余的 @Binding,@Environment 一样的道理,将 Property 读写转到 Binding 和 Environment 类实现了

    @propertyDelegate

    假如要保存多个值,就会重复 多次。为了避免重复代码,可以将相同的行为指派某个代理对象去做,为此引入 Property Delegates。

     

    @dynamicMemberLookup 的实现流程

    SIMPLE_DECL_ATTR(dynamicMemberLookup, DynamicMemberLookup,
      OnNominalType,
      9)

    展开全文
  • swift5.0 原版文档

    2020-07-17 17:50:49
    TheSwiftProgrammingLanguageSwift5.epub swift5.0 原版文档
  • Xcode作为iOS的开发神器,为我们提供了十分丰富的文档提示功能,在开发过程中,我们可以十分方便的按下Option键,选中一个类或者方法查看其文档说明。而实际开发过程中我们也可以使用规范的方法添加注释,达到这样的...


           作为一个有代码洁癖的猿类,对整洁的注释必须要强迫症,xcode为我们提供了十分丰富的文档提示功能,在开发过程中,我们可以十分方便的按下Option键,选中一个类或者方法查看其文档说明。而实际开发过程中我们也可以使用规范的方法添加注释,达到这样的效果。本篇主要介绍几种常用的文档注释方法。


    多行文档注释

    /**
        多行注释文档相比于普通多行注释多了一个星号。
        在这里可以使用markDown语法,书写各种提示信息
        如:显示一个有序列表
        1. 有序列表
        2. 有序列表
        3. 有序列表
    */



     /**
         * 多行注释文档相比于普通多行注释多了一个星号。
         * 在这里可以使用markDown语法,书写各种提示信息
         * 如:显示一个有序列表
         * 1. 有序列表
         * 2. 有序列表
         * 3. 有序列表
         */

    效果



    单行文档注释

      /// 文档注释支持 markdown语法
        ///  # 标题1
        /// ## 标题2
        /// hello oc,下面的空行是为了换行
        ///
        /// hello swift
        /// - 这里使用了无序列表
        /// - 使用加粗 **this**, 使用斜体 _this_
        /// - 添加一个链接: [百度](http://www.baidu.com)
        /// - 添加一个图片:![swift picture]
        func singleLineComment()
        {
    
        }

    效果



    方法或函数的注释

    方法的注释包括传入参数、返回值、和异常等说明,函数的注释对于团队合作相关重要





    标签注释

        //MARK: - 在代码的某处添加一个标签,可以使查看类视图更加方便
        //TODO: - 将来可能会继续编辑的部分
        //FIXME: - 将要修改的部分


    算法注释

    算法是相对比较复杂的方法,我们通过注释对其进行详尽的说明,其文档注释使用的关键字如下:

        /// - Precondition: 前置条件
        /// - Postcondition: 后置条件
        /// - Requires:  算法需要的信息
        /// - Invariant:  循环不变量
        /// - Complexity: 复杂度
        /// - Important: 描述重要信息
        /// - Warning:  描述警告信息
        /// - Attention: 描述注意事项
        /// - Note:  一些记录
        /// - Remark:  一些评论心得



    展开全文
  • 文档资源学习笔记正逐步更新于简书:https://www.jianshu.com/nb/39027334
  • Swift 文档注释规范

    2016-01-23 20:40:48
    代码的结构和组织关乎了开发童鞋们的节操问题。明确和一致的代码表示了明确和一贯的思想。编译器并没有一个挑剔的口味,但当谈到命名...因此,这一周,我们将在此为嗷嗷待哺的 Swift 开发者们记录一下文档说明。 好

    代码的结构和组织关乎了开发童鞋们的节操问题。明确和一致的代码表示了明确和一贯的思想。编译器并没有一个挑剔的口味,但当谈到命名,空格或文档,人类的差异就体现出来了。

    NSHipster 的读者无疑会记得去年发表的关于文档的文章,但很多东西已经在 Xcode 6 中发生了变化(幸运的是,基本上算是变得更好了)。因此,这一周,我们将在此为嗷嗷待哺的 Swift 开发者们记录一下文档说明。

    好了,来让我们仔细看看。


    从 00 年代早期,Headerdoc 就一直作为苹果首选的文档标准。从 Perl 脚本解析勉强的 Javadoc 注释作为出发点,Headerdoc 最终成为了苹果在线文档及 Xcode 中的开发者文档的后台引擎。

    随着 WWDC 2014 的发布,开发者文档被翻修并进行了时尚的新设计,包含了 Swift 和 Objective-C 的切换。 (如果你看过任何新的 iOS 8 的在线 API,那你已经见过这个新设计了)

    真正让人意外的是,文档的格式 也发生了变化。

    在 Swift 的代码里调用快速文档 (Quick Documentation)(⌥ʘ)时 Headerdoc 没有正确解析注释:

    Swift
    /**
        让我们随便来写点什么.
    
        @param 啦啦啦啦,这货是参数。
    
        @return 咯咯咯咯,这货是返回值。
    */
    func foo(bar: String) -> AnyObject { ... }
    

    Unrecognized Headerdoc

    但如果修改一下标记方式,就 可以 被正确解析:

    New Recognized Format

    Swift
    /**
        让我们随便来写点什么.
    
        :param: 啦啦啦啦,这货是参数。
    
        :returns: 咯咯咯咯,这货是返回值。
    */
    func foo(bar: String) -> AnyObject { ... }
    

    那么,这个陌生的新文件格式是个什么情况?事实证明,SourceKit(Xcode 使用的私有框架,在此前以其高 FPS 崩溃闻名)包括一个解析 reStructuredText 的基本解析器。虽然仅实现了 specification 的一个子集,但涵盖基本的格式已经足够了。

    基本标记

    文档注释通过使用 /** ... */ 的多行注释或 ///... 的单行注释来进行区分。在注释块里面,段落由空行分隔。无序列表可由多个项目符号字符组成:-+、 *、  等,同时有序列表使用阿拉伯数字(1,2,3,...),后跟一个点符 1. 或右括号 1) 或两侧括号括起来 (1)

    Swift
    /**
        你可以制作 *斜体*, **粗体**, 或 `代码` 的字体风格.
    
        - 列表很不错,
        - 但最好不要叠套
        - 子列表的格式
    
          - 就不太好了.
    
        1. 有序列表也一样
        2. 对那些有序的东西来说;
        3. 阿拉伯数字
        4. 是唯一支持的格式.
    */
    

    定义与字段列表

    定义和字段列表跟 Xcode 里的快速文档弹出内容显示的差不多,定义列表会更紧凑一些:

    Swift
    /**
        Definition list
            一些术语以及它们的定义.
        Format
            左对齐术语,放在缩进的定义下面.
    
        :Field header:
            字段列表隔开一些。
    
        :Another field: 字段列表可以紧跟开始,不需要另起一行并缩进。
            随后缩进的行也被视为内容的一部分.
    */
    

    两个特殊字段用于记录参数和返回值:分别为::param: 和 :returns::param: 后跟的是参数的名称,然后是说明。返回值没有名字,所以  :returns: 后就是说明:

    Swift
    /**
        重复一个字符串 `times` 次.
    
        :param: str     需要重复的字符串.
        :param: times   需要重复 `str` 的次数.
    
        :returns: 一个重复了 `str` `times` 次的新字符串.
    */
    func repeatString(str: String, times: Int) -> String {
        return join("", Array(count: times, repeatedValue: str))
    }
    

    代码块

    代码块也可以嵌入到文档的注释里,这对于演示正确的使用方式或实现细节很有用。用至少两个空格来插入代码块:

    Swift
    /**
        `Shape` 实例的面积.
    
        计算取决于该实例的形状。如果是三角形,`area` 将相当于:
    
          let height = triangle.calculateHeight()
          let area = triangle.base * height / 2
    */
    var area: CGFloat { get }
    

    我的自行车类的新文档

    当这个应用在整个类的时候看起来怎么样?事实上,看起来相当的不错:

    Swift
    import Foundation
    
    /// 
    展开全文
  • 该文章翻译自apple官方文档:The Swift Programming Language(Swift 4.1) A Swift Tour -- 一个Swift 旅行 Tradition suggests that the first program in a new language should print the words “Hello, world!...
  • 之前发的翻译了一部分,现在又翻译到了元组,已经下载的,将不用重复给下载分
  • 该文章翻译自apple官方文档:The Swift Programming Language(Swift 5.0)   原文: This book describes Swift 5, the default version of Swift that’s included in Xcode 10.2. You can use Xcode 10.2 to ...
  • 非常简单就两行代码:// 文档路径 let url = NSURL(fileURLWithPath: filePathDOC) documentInteractionController = UIDocumentInteractionController(URL: url) documentInteractionController....
  • 转载请注明:关东升的博客 前面说到Swift注释的语法有两种:单行注释(//)和多行注释(/*...*/)。这里来介绍一下他们的使用规范。 文件注释文件注释就在每一个文件开头添加注释,文件注释通常包括如下信息:版权...
  • 命令行工具,通过 hook Clang 和 SourceKit 来更精确地提取注释内容并生成文档,非常高端
  • MBDocCapture可以轻松地将文档扫描功能添加到您的iOS应用程序,还可以进行图像编辑(裁剪和对比度增强)
  • 参看文档 http://practicalswift.com/2014/06/14/the-swift-standard-library-list-of-built-in-functions/
  • Welcome to Swift 策划给:iOS爱好者, 标题// 本人试着利用闲暇时间翻译苹果官方文档,限于水平,难免有误,欢迎大家指正. 2014年6月3日 建议书编号: 123-4567 关于 swift(雨燕) Swift 是一门全新的iOS和OS X 应用...
  • 对于实用过OC的人来说实用swift上手时非常容易的,swift包括了oc的大部分功能,但是swift毕竟是一门新的编程语言,它和OC还是 有很多不同的地方,而且提供了不少新功能,所以本人在读swift文档的时候,把两者之间...
  • 1.使用工具 jazzy , github链接地址...  jazzy安装方法: 打开终端, 1.输入 sudo gem install jazzy , 2.... 2.如何在xcode中使用jazzy, 我用swift创建了一个RxTest_old的工程   第一步: 打开终端, cd 到RxTest_ol...
  • Swift5.x - 中文文档

    2020-07-14 11:01:52
    由于官方文档全是英文版本,这里我是一边学习一边记录下来,希望可以帮到朋友们更轻松地学习Swift相关的内容。 这里给使用CSDN的童鞋们说声抱歉,由于主要是在掘金上记录了Swift的内容,所以这里只是做个转载的需求...
  • swift 方法注释快捷键

    2019-07-16 15:14:39
    command + Option + / 快捷键 建议自己写的函数都用此方法进行注释 包含了 参数是什么 返回值是什么 函数功能是什么
  • swift 2.3中文版文档API

    2020-07-30 23:32:11
    The Swift Programming Language 中文版 - v2.3
1 2 3 4 5 ... 20
收藏数 20,878
精华内容 8,351
关键字:

swift文档