使用Swift,来自Java背景,为什么要选择Struct而不是Class?看起来它们是相同的,使用Struct提供更少的功能.为什么选择呢?
是什么区别let,并var在苹果的雨燕语言?
根据我的理解,它是一种编译语言,但它不会在编译时检查类型.这让我感到困惑.编译器如何知道类型错误?如果编译器没有检查类型,那么生产环境是不是有问题?
来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."
任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.
从集合框架概述:
不支持修改操作(例如
add,remove和clear)的集合称为不可修改.不可修改的集合是可修改的.另外保证
Collection对象中没有可见变化的集合称为不可变.不可变的集合是可变的.
我无法理解这种区别.这里不可修改和不可变
的区别是什么?
我可以使用哪些情况Collections.emptyMap()?文档说如果我希望我的集合是不可变的,我可以使用这个方法.
为什么我想要一个不可变的空集合?有什么意义?
任何人请举例说明Mutable对象和Immutable对象之间的差异.
我指的是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) 我在过去一小时内阅读了很多帖子,但是我仍然不太清楚使用不可变对象作为Hashmap中的键的概念.我有一个哈希映射,其键作为字符串.hashmap中的值是MyStore,其中MyStore表示有关我拥有的商店的信息.String表示地址.在我的代码中,我的逻辑是,我首先在地图中查找该键,如果存在 - >获取其值,如果它不存在则将其放入hashmap中.我的经理告诉我,密钥将来会改变,那就是我的商店的地址将来会改变.他说在这种情况下,我首先检查密钥是否存在的逻辑不起作用.我不明白他的意思.我想非常清楚地理解以下几点 -
如果之前已经讨论过,我并不是要创建一个重复的帖子.如果我错过阅读有关我所有问题答案的帖子,请指出.如果没有,请以外行的方式解释我的上述问题,以便将来对其他读者有用:).随意编辑我的帖子的主题,以便将来如果有人有类似的问题,他们会直接降落在这里:)
Set是一系列独特元素的无序集合.几乎与数组类似.
我想在一个Set中添加/插入多个元素String.但是只提供了一种方法,只能插入一个元素(接受单个Set元素作为参数参数),我收集了字符串(id).
@discardableResult mutating func insert(_ newMember: Set.Element) -> (inserted: Bool, memberAfterInsert: Set.Element)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我尝试过:
我尝试创建一个非常类似于insert(_:)方法的扩展,但它可以接受多个Set元素.它与使用迭代而不是集合相同,但不需要在任何地方手动处理它.
extension Set {
@discardableResult mutating func insert(_ newMembers: [Set.Element]) -> (inserted: Bool, memberAfterInsert: Set.Element) {
newMembers.forEach { (member) in
self.insert(member)
}
}
}
Run Code Online (Sandbox Code Playgroud)
它应该工作,如果我按预期返回一个元组但不知道如何以及在哪里(哪一行)以及返回值的内容.
这是错误消息.
期望返回的函数中缺少返回'(inserted:Bool,memberAfterInsert:Set.Element)'
什么可以解决这个问题.是否有更好的解决方案/方法来处理此操作?
我在假设,如果你有一个包含一个Java集<>内(或在地图<>对于这个问题的关键)的对象,所使用的任何字段,以确定身份或关系(通过纠正hashCode(),equals(),compareTo()等.)如果不对集合上的操作造成未指定的行为,则无法更改?(编辑:在其他问题中提到)
(换句话说,这些字段应该是不可变的,或者您应该要求从集合中删除对象,然后更改,然后重新插入.)
我问的原因是我正在阅读Hibernate Annotations参考指南,它有一个例子,其中有一个HashSet<Toy>但是Toy类有字段name并且serial是可变的并且也用于hashCode()计算......一个红旗在我脑海中消失了我只想确保理解它的含义.
java ×5
swift ×5
collections ×3
immutability ×2
ios ×2
mutable ×2
class ×1
identity ×1
objective-c ×1
set ×1
struct ×1
terminology ×1
tuples ×1