小编SLN*_*SLN的帖子

为什么可选常量不会自动具有默认值nil

以下代码工作正常

struct carConfi {
    var owner: String?
    let brand: String = "BMW"
    var currentMile: Double = 2000
}

let tomCar = carConfi()
Run Code Online (Sandbox Code Playgroud)

但是,如果我将属性的类型更改owner为常量,则初始化程序将出错

struct carConfi {
        let owner: String? // Change to constant
        let brand: String = "BMW"
        var currentMile: Double = 2000
    }

let tomCar = carConfi() //error: missing argument for parameter 'owner' in call 
Run Code Online (Sandbox Code Playgroud)

我做了一点搜索,结果是因为可选变量自动具有默认值nil

我猜:因为一旦设置了常量,它就无法更改,如果可选常量自动收到,nil那么它将保持不变nil,非常愚蠢,可能会对用户产生影响

问:我的大学并不完全相信猜测,他告诉我必须有更多理由.如果有人能向我解释,我将非常感激

谢谢

optional swift

6
推荐指数
1
解决办法
422
查看次数

将值类型变量传递给函数时如何复制它,该副本是什么?

Swift的字符串类型是值类型.如果创建新的String值,则在将String值传递给函数或方法时,或者将其赋值给常量或变量时,将复制该String值.

它被分配给常量或变量时被复制,这对我来说很有意义.但是当传递给函数的值类型变量也会被复制时,这会让我感到困惑.

将值类型变量传递给函数时如何复制?什么样的"空间"持有这个副本?它是在场景后面无形地创建的某种临时变量,在函数进程被破坏之后?

谢谢

function value-type swift

6
推荐指数
1
解决办法
94
查看次数

什么使属性成为 Swift 中的计算属性

让我们从代码片段开始:

St Foo {
    var proA: Int = 0 { // needs initialization
        willSet {
            print("about to set proA to \(newValue) from \(proA)")
        }
        didSet {
            print("already set proA to \(proA) from \(oldValue)")
        }
    }

    var ProB: Int { // do not needs initialization 
        return 1
    }
}

let foo = Foo()
foo.proA = 23
print(foo.ProB)
Run Code Online (Sandbox Code Playgroud)

以下是我个人对存储和计算属性的一些理解:

a:只有观察者的属性(willSet 和 didSet)不是计算属性而是存储属性(例如上面代码中的proA属性)。

b:计算属性不能有初始化(见上面代码的注释)。

c: setter 相当于属性观察者,属性观察者只是变异前后的 setter + 观察者。

问题:

1.我想知道是什么使属性成为计算属性?只要该属性有一个 getter 并返回它就是一个计算属性,这是否正确?

2.我的所有理解(a, b & c)都正确吗?如果没有,请您指出来。

3. …

properties swift computed-properties property-observer

6
推荐指数
1
解决办法
5977
查看次数

GitHub Action:如何从表达式求值中获取值并将其分配给环境变量

环境表达式通常直接赋值,如下例所示

  - name: set up env var
    env:
      TAG: v1.2.3
    run: echo $TAG
Run Code Online (Sandbox Code Playgroud)

但是如何从 shell 脚本评估中获取值呢?例如,在我的终端中,我可以通过以下方式获取当前标签git describe --exact-match --tags $(git log -n1 --pretty='%h')

但是当我尝试将此脚本放入环境中时,如下所示

  - name: set up env var
    env:
      TAG: $(git describe --exact-match --tags $(git log -n1 --pretty='%h'))
    run: echo $TAG 
Run Code Online (Sandbox Code Playgroud)

打印出的 echo$(git describe --exact-match --tags $(git log -n1 --pretty='%h'))意味着它不被计算而是被视为字符串。

如何获取 的值git describe --exact-match --tags $(git log -n1 --pretty='%h')并将其分配给环境变量TAG

github-actions

6
推荐指数
1
解决办法
8848
查看次数

为什么我可以更改/重新分配从类实例化的常量值

我创建了以下课程

class Person {
    var firstName: String
    var lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }


    func fullName() -> String {
        return "\(firstName) \(lastName)"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我从类中实例化了一个常量值

 let john = Person(firstName: "Johnny", lastName: "Applessed")
Run Code Online (Sandbox Code Playgroud)

问题:为什么我可以更改变量的内容john?这不是常数吗?有人可以帮我解释一下,非常感谢。

john.firstName = "John"

print(john.firstName) // -> John
Run Code Online (Sandbox Code Playgroud)

class constants swift

5
推荐指数
1
解决办法
920
查看次数

如何创建引用特定函数的函数类型的类型

斯威夫特的官方文件

您可以像使用Swift中的任何其他类型一样使用函数类型.例如,您可以将常量或变量定义为函数类型,并为该变量分配适当的函数:

func addTwoInts(a: Int, _ b: Int) -> Int {
    return a + b
}

var mathFunction: (Int, Int) -> Int = addTwoInts
Run Code Online (Sandbox Code Playgroud)

这里是示例代码:

它定义一个名为的变量mathFunction,它具有一个带两个Int值的函数类型,并返回一个Int值.设置此新变量以引用名为addTwoInts的函数

问题:函数类型可以像Swift中的任何其他类型一样使用,我想知道,因为我如何创建一个类型别名,它具有一个带有两个Int值的函数类型,并返回一个Int值.设置此新变量以引用名为addTwoInts的函数

我试过这个,显然,我错了.

在此输入图像描述

types function swift

5
推荐指数
1
解决办法
2537
查看次数

可选类型中的 nil,它背后到底是什么?它在记忆中是什么样子?

class Person{
    let name: String
    init(name: String) {
        self.name = name
    }
}

var john: Person?
Run Code Online (Sandbox Code Playgroud)

上面的代码片段定义了一个名为 的可选类型变量john。此时,变量的初始值为nil

类实例将其值保存在堆空间中并将引用存储在堆栈中。(如果我错了,请纠正我)john在这种情况下是一个未分配的可选变量,它还没有引用任何实例。

问题:PC 在哪里存储名称字符串“john”?它是否已经被创建并存储在堆栈中并等待对堆中某个实例的引用?值“nil”存储在哪里?

非常感谢

class pass-by-reference optional swift

5
推荐指数
1
解决办法
291
查看次数

当子类中有覆盖函数时如何转换为超类

创造了一辆超级轿车和一辆子级捷豹.子类中的函数info() - > Void覆盖了超类的功能.已经创建了一个名为theAuto of Jaguar的实例.

问题:

看来我不能起来铸请将auto到的类型汽车,请参阅代码片断,其意见

class Car {
        func info() {
                print("You've got a car")
        }
}

class Jaguar : Car {
       override func info() {
               print("You've got a Jaguar")
       }
}

let theAuto = Jaguar()
theAuto.info() // --> You've got a Jaguar
let auto = theAuto as Car // casting but seems not working 
auto.info() // --> You've got a Jaguar
print(type(of: auto)) // …
Run Code Online (Sandbox Code Playgroud)

types casting class swift

5
推荐指数
1
解决办法
502
查看次数

complition处理程序闭包是否始终在后台线程运行?

完成处理程序闭包在ios开发中很常见.例如dataTask(with:completionHandler:)URLSession类中.

UI引擎由主线程管理,URLSession的API调用在后台线程下运行,如果处理程序中需要UI更新,则需要将其调度到主线程.

问题1:来自ios框架的所有完成Handler闭包是否都在后台线程中运行?

问题1.1:例如,开发人员创建的所有转义闭包是否都在后台线程中运行?

问题2:我在iPhone X模拟器中看到了多达8个线程.哪一个是主线程,哪一个是ios中的后台线程?他们有不同的优先级和计算能力吗?

multithreading closures ios swift

5
推荐指数
1
解决办法
512
查看次数

无法在 Azure DevOps 管道中激活 conda

在由 conda 构建的 python 项目上测试 azure devops 管道

jobs:
  - job: pre_build_setup
    displayName: Pre Build Setup
    pool:
      vmImage: 'ubuntu-18.04'
    steps:
      - bash: echo "##vso[task.prependpath]$CONDA/bin"
        displayName: Add conda to PATH

  - job: build_environment
    displayName: Build Environment
    dependsOn: pre_build_setup
    steps:
      - script: conda env create --file environment.yml --name build_env
        displayName: Create Anaconda environment
      - script: conda env list
        displayName:  environment installation verification

  - job: unit_tests
    displayName: Unit Tests
    dependsOn: build_environment
    strategy:
      maxParallel: 2
    steps:
      - bash: conda activate build_env
Run Code Online (Sandbox Code Playgroud)

最后一步- bash: …

yaml conda azure-pipelines

5
推荐指数
1
解决办法
849
查看次数