相关疑难解决方法(0)

快速语言中的结构与类

来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."

任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.

swift

184
推荐指数
6
解决办法
7万
查看次数

如何在Swift中连接字符串?

如何在Swift中连接字符串?

Objective-C我们不喜欢

NSString *string = @"Swift";
NSString *resultStr = [string stringByAppendingString:@" is a new Programming Language"];
Run Code Online (Sandbox Code Playgroud)

要么

NSString *resultStr=[NSString stringWithFormat:@"%@ is a new Programming Language",string];
Run Code Online (Sandbox Code Playgroud)

但是我想用Swift语言做这件事.

string concat string-concatenation swift

182
推荐指数
10
解决办法
26万
查看次数

可变对象与不可变对象

我试图让我的头围绕可变对象和不可变对象.使用可变对象会导致很多不良操作(例如,从方法中返回一个字符串数组),但我无法理解其中的负面影响.使用可变对象的最佳做法是什么?你应该尽可能地避开它们吗?

oop mutable immutability

166
推荐指数
6
解决办法
8万
查看次数

Swift和mutating结构

当谈到在Swift中改变值类型时,有些事情我并不完全理解.

正如"The Swift Programming Language"iBook所述: 默认情况下,不能在其实例方法中修改值类型的属性.

因此,为了实现这一点,我们可以mutating在结构和枚举中使用关键字声明方法.

对我来说并不完全清楚的是:您可以从结构外部更改var,但不能从自己的方法中更改它.这对我来说似乎是违反直觉的,因为在面向对象语言中,你通常会尝试封装变量,因此它们只能从内部进行更改.对于结构,这似乎是另一种方式.详细说明,这是一段代码片段:

struct Point {
    var x = 0, y = 0
    mutating func moveToX(x: Int, andY y:Int) { //Needs to be a mutating method in order to work
        self.x = x
        self.y = y
    }
}

var p = Point(x: 1, y: 2)
p.x = 3 //Works from outside the struct!
p.moveToX(5, andY: 5) 
Run Code Online (Sandbox Code Playgroud)

有没有人知道结构不能从他们自己的上下文中改变他们的内容的原因,而内容可以很容易地在其他地方改变?

struct value-type swift

90
推荐指数
5
解决办法
4万
查看次数

Swift中的不可变/可变集合

我指的是Apple的Swift编程指南,用于理解用Swift语言创建Mutable/immutable对象(Array,Dictionary,Sets,Data).但我无法理解如何在Swift中创建不可变的集合.

我想在Objective-C中看到Swift中的等价物

不可变阵列

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Run Code Online (Sandbox Code Playgroud)

可变阵列

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Run Code Online (Sandbox Code Playgroud)

不变字典

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Run Code Online (Sandbox Code Playgroud)

可变字典

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
Run Code Online (Sandbox Code Playgroud)

objective-c mutable immutability ios swift

83
推荐指数
4
解决办法
8万
查看次数

如果"let"关键字用于在swift中定义常量/不可变,那么"static"关键字的用途是什么?

我对在swift中使用static关键字感到有些困惑.正如我们所知,swift引入了let关键字来声明不可变对象.就像声明一个表视图单元的id一样,它最有可能在其生命周期内不会改变.现在什么是在一些struct的声明中使用static关键字:

struct classConstants
{
    static let test = "test"
    static var totalCount = 0
}
Run Code Online (Sandbox Code Playgroud)

let关键字也是这样.在Objective C中,我们使用static来声明一些常量

static NSString *cellIdentifier=@"cellId";
Run Code Online (Sandbox Code Playgroud)

除此之外让我更好奇的是使用static关键字以及letvar关键字.谁能解释一下我在哪里使用这个静态关键字?更重要的是我们真的需要swift的静态吗?

static constants swift

53
推荐指数
3
解决办法
4万
查看次数

如何在Swift中创建不可变数组?

如何在Swift中创建不可变数组?

对文档的肤浅解读表明你可以做到

let myArray = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,这实际上产生了一个可变的,固定大小的数组.这种可变性创建了常见的谜题,其中包含未预料到的别名和函数,这些谜题会改变其参数:

let outterArray = [myArray, myArray]
outterArray[0][0] = 2000
outterArray //=> [[2000,2,3],[2000,2,3]]   surprise!

func notReallyPure(arr:Int[]) -> () { arr[0] = 3000 }
notReallyPure(myArray)
myArray // => [3000,2,3]
Run Code Online (Sandbox Code Playgroud)

没比C好多少

如果我想要不变性,那么最好将它包装NSArray成如此:

let immutableArray = NSArray(myArray: [1,2,3])
Run Code Online (Sandbox Code Playgroud)

这看起来很疯狂.我在这里错过了什么?

更新时间(2015-07-26):

这个问题可以追溯到斯威夫特的早期阶段.从那时起,Swift已经更新,因此不可变数组实际上是不可变的,如下面的答案所示.

arrays swift

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

"let"关键字在Swift中的工作原理是什么?

我在指南中读到了这个简单的解释:

在编译时不需要知道常量的值,但是必须为其分配一次值.

但我想要比这更详细一些.如果常量引用了一个对象,我还可以修改它的属性吗?如果它引用了一个集合,我可以添加或删除它中的元素吗?我来自C#背景; 是否类似于readonly工作(除了能够在方法体中使用它),如果不是,它有什么不同?

constants swift

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

为什么不能在Swift中为@IBOutlet分配let而不是var?

我正在关注Swift的教程,我注意到作者使用var而不是let在声明@IBOutlet变量时.所以我很好奇为什么我不能使用,let因为即使对象是常量,对象的属性仍然是可变的,或者不是这样的情况?

错误使用时,Xcode中显示let

@IBOutlet 属性要求属性是可变的

但我很困惑,因为它questionLabel是一个UILabel对象,不一定是对象的属性.或者questionLabel对象是当前viewController的属性?

import UIKit

class ViewController: UIViewController {

    @IBOutlet let questionLabel: UILabel!

}
Run Code Online (Sandbox Code Playgroud)

如果我过度分析,请提前感谢您.

xcode ios swift

13
推荐指数
3
解决办法
1618
查看次数

无主与弱.为什么我们应该更喜欢无主?

正如Apple在"Swift编程语言"中所说,似乎我们应该unownedweak任何可能的更喜欢:

如果捕获的引用永远不会变为nil,则应始终将其捕获为无主引用,而不是弱引用.

本页的"弱和无主参考"部分

我确实知道这两者之间的区别.但我好奇的是有没有很好的理由,宁愿 unownedweak?我认为weak更安全,我们可以总是编写[weak obj]和可选的绑定检查,而不考虑存在的可能性obj.

它与某些性能考虑或我错过的东西有关吗?或者是否完全可以使用weak而不是一直使用unowned

memory-management swift

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