小编SLN*_*SLN的帖子

强制解缠选项与隐式解包选项之间的区别

我最初对强行展开和隐式展开非常困惑.现在,以下理解来自我的自学:

没有可用的隐含解包的动作,但有一些所谓的隐式解开选配.隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用.Normal Optionals需要if let绑定强制unwrapping(!)动作来访问可选变量后面的可能值.

摘要:

强迫去包裹是一个行动的正常选配完成.

隐式解包的Optionals Optionals,通常用于类初始化,并在使用时传递没有感叹号的值.

问题:

我对吗?如果我的理解不准确,如果你纠正我,我将不胜感激.

谢谢

optional swift forced-unwrapping

25
推荐指数
2
解决办法
1万
查看次数

为什么 C 中的函数 return 是一条语句?

一个表达式产生一个值,语句改变机器的状态,也就是副作用。但是,我一直在读那个函数 return 是一个声明。如果我调用一个返回空值的函数,这将如何改变机器的任何状态?或者,如果我调用一个返回非空值的函数,如果我不使用它而只是调用它,这将如何改变任何状态?

我只是不明白为什么返回是一个声明?

资料来源:编程语言中的概念。剑桥:剑桥大学出版社,3.4.1 Statements and Expressions,p。26

c statements

16
推荐指数
3
解决办法
471
查看次数

为什么常量约束属性来自结构实例而不是类实例?

当我尝试更改实例的ID属性时byValueObj,我收到一个错误,告诉我无法分配常量的属性,即使属性是变量.但是,我可以在类实例上执行此操作.我知道它可能与by值和引用机制有关.但我对它没有非常明确和正确的理解.有人可以帮我解释一下吗?谢谢.

struct CreatorValue{
    var ID = 2201
}
class CreatorRefer{
    var ID = 2203
}

let byValueObj = CreatorValue()
let byReferObj = CreatorRefer()

byValueObj.ID = 201 //Error: cannot assign to property: 'byValueObj' is a 'let' constant
byReferObj.ID = 203 //works fine here
Run Code Online (Sandbox Code Playgroud)

structure class constants swift

11
推荐指数
1
解决办法
2004
查看次数

默认情况下,常量未分配的可选项不会为nil

到目前为止我的理解:如果定义一个可选变量而不指定任何值,编译器将自动分配nil

代码片段:

A :

var someOptional : Int? //Change to `let` to trigger error 
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue
Run Code Online (Sandbox Code Playgroud)

上面的代码片段工作正常,但是,当我将变量someOptional更改为常量时,编译器大喊错误(请参见下图)

在此输入图像描述

B:

然后我尝试了类似的代码来解决问题.

var someOptional : Int?
print(someOptional)
Run Code Online (Sandbox Code Playgroud)

尽管如此,它仍然适用于变量,而常量类型失败.

在此输入图像描述

结论:

如果你定义一个常量可选,你必须明确指定nil,如果你的意思.因为它看起来没用(为什么你需要一个指定的常量选项nil),如果编译器自动为你做了这个,它可能会引入一个错误.

题:

为什么编译器承担nilvar申报自选但不适合let申报自选项目?

initialization optional swift

10
推荐指数
1
解决办法
766
查看次数

通常,取消引用指针表达式会产生引用类型吗?

引用指针会间接使用对象的值.但我从来没有真正理解"使用"是什么意思.我开始考虑这个问题,直到我的编译器产生以下代码的错误

int i = 0, *pi = &i;
decltype(*pi) c; // error: 'c' declared as reference but not initialized.
Run Code Online (Sandbox Code Playgroud)

我看了很长时间的错误并搜索了一些我只能给出以下论点的问题.我不知道他们是否正确.

参数1:

1)*p是一个不是变量(或非变量表达式)的表达式

2)取消引用指针表达式产生一个引用,我们实际上是使用一个引用来访问该对象的值

参数2:

仅为其decltype返回引用的解除引用表达式,它不是一般情况

请指出上述论点的任何不正确或不准确的描述.

c++ pointers reference dereference c++11

9
推荐指数
2
解决办法
668
查看次数

当存在具有默认参数的构造函数时,是否有2次初始化

我的问题是如何初始化具有初始化程序的成员数据,其中构造函数中还有一个默认参数.

class InputPlay {

    public:
        InputPlay(std::string s = "test" ) : _s(s) {  };

    private:
        std::string _s = "default";
};
Run Code Online (Sandbox Code Playgroud)

问题:

调用构造时,变量_s是否会有2次初始化?又名_s将由字符串文字默认初始化,然后由构造函数中的默认参数"test"替换?

c++ constructor initialization

7
推荐指数
3
解决办法
154
查看次数

如何评估vimrc中是否设置了环境变量

如何评估是否设置了 bash 环境变量

例如

function! Myfoo(arg)
  if $SomeVar is set/exist ----> how to eval the SomeVar has been set
     ....
  endif
endfunction
Run Code Online (Sandbox Code Playgroud)

vim function

7
推荐指数
1
解决办法
2112
查看次数

为什么可选常量不会自动具有默认值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
查看次数