我想在Swift 2中做一些我以前用其他多种语言做的事情:用自定义消息抛出运行时异常.例如(在Java中):
throw new RuntimeException("A custom message here")
Run Code Online (Sandbox Code Playgroud)
我知道我可以抛出符合ErrorType协议的枚举类型,但我不想为我抛出的每种类型的错误定义枚举.理想情况下,我希望能够尽可能地模仿上面的例子.我研究了创建一个实现ErrorType协议的自定义类,但我甚至无法弄清楚该协议需要什么(参见文档).想法?
我正在更新我的代码以使用Swift,我想知道如何打印与'catch all'子句匹配的异常的错误详细信息.我稍微修改了这个Swift语言指南页面中的示例来说明我的观点:
do {
try vend(itemNamed: "Candy Bar")
// Enjoy delicious snack
} catch VendingMachineError.InvalidSelection {
print("Invalid Selection.")
} catch VendingMachineError.OutOfStock {
print("Out of Stock.")
} catch VendingMachineError.InsufficientFunds(let amountRequired) {
print("Insufficient funds. Please insert an additional $\(amountRequired).")
} catch {
// HOW DO I PRINT OUT INFORMATION ABOUT THE ERROR HERE?
}
Run Code Online (Sandbox Code Playgroud)
如果我遇到意外的异常,我需要能够记录导致它的原因.
对于我的生活,我无法弄清楚下面的C#代码示例中发生了什么.测试类的集合(List)属性设置为只读,但我可以在对象初始值设定项中看似分配给它.
**编辑:修复了List'getter'的问题
using System;
using System.Collections.Generic;
using NUnit.Framework;
namespace WF4.UnitTest
{
public class MyClass
{
private List<string> _strCol = new List<string> {"test1"};
public List<string> StringCollection
{
get
{
return _strCol;
}
}
}
[TestFixture]
public class UnitTests
{
[Test]
public void MyTest()
{
MyClass c = new MyClass
{
// huh? this property is read only!
StringCollection = { "test2", "test3" }
};
// none of these things compile (as I wouldn't expect them to)
//c.StringCollection = { "test1", "test2" …Run Code Online (Sandbox Code Playgroud) 我希望在Swift(2.0)中反序列化JSON时不传递任何选项.我最初尝试过:
NSJSONSerialization.JSONObjectWithData(data, options: nil)
Run Code Online (Sandbox Code Playgroud)
但那不编译,我得到错误:
类型NSJSONReadingOptions不符合协议NilLiteralConvertible
枚举NSJSONReadingOptions没有任何"无"选项,所以如果我不想要任何这些选项,该怎么办?
我正在寻找一种简单,安全的解决方案,用于使用Node存储用户的密码.我是加密新手,但一直试图通过在线研究将解决方案整合在一起.我正在寻找验证,我提出的是一个基本(不是银行,医院等)安全需求的Web应用程序的可靠解决方案.这里是:
var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;
function createHashedPassword(plainTextPassword, cb) {
crypto.randomBytes(SALT_LENGTH, function (err, salt) {
console.time('password-hash');
crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
console.timeEnd('password-hash');
return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
});
});
};
Run Code Online (Sandbox Code Playgroud)
......这是我做出的选择让我达到了这一点:
使用什么哈希算法?
基于这篇被广泛引用的文章,看起来主要的竞争者是PBKDF2,bcrypt和scrypt.我选择了PBKDF2,因为它内置了Node支持.
什么盐的大小?
这个堆栈溢出答案似乎是我能找到的最直接的答案.我仍然不太清楚为什么64字节是正确的盐大小.当我谷歌的时候,我得到一个叠层交换答案像这样,但我不知道它适用于节点的算法?在这里完全混淆,针对使用此节点功能的新手的解释将是非常棒的.
使用什么密钥长度?
再一次,我的选择主要取决于上面的相同答案,但我对"为什么"的基本知识一模糊.答案是"生成小于输入的密钥是浪费,所以至少要使用64个字节".咦?再一次,实际的解释会有所帮助.
要使用多少次迭代?
对于这个问题,我根据这个堆栈交换答案做出了我的选择.我不太了解它,但我确实认为该算法大约需要8ms.所以,正如你所看到的那样,我将定时器放在函数上,并且我调整了迭代次数,以便在我的机器上进行调整.
谢谢!
我一直在看Swift类,其中定义了两种方法,它们的返回类型不同.我不习惯使用允许这种语言的语言(Java,C#等),所以我去寻找描述它如何在Swift中工作的文档.我在任何地方都找不到任何东西.我本来期望在Swift书中有关于它的整个部分.这记录在哪里?
这是我正在谈论的一个例子(我正在使用Swift 2,FWIW):
class MyClass {
subscript(key: Int) -> Int {
return 1
}
subscript(key: Int) -> String {
return "hi"
}
func getSomething() -> Int {
return 2
}
func getSomething() -> String {
return "hey"
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
let obj = MyClass()
//let x = obj[99]
// Doesn't compile: "Multiple candidates fail to match based on result type"
let result1: String = obj[123]
print("result1 \(result1)") // prints "result1 hi"
let result2: Int = obj[123]
print("result2 \(result2)") // prints …Run Code Online (Sandbox Code Playgroud) 据我所知,从Xcode 6.3/Swift 1.2开始,我可以在类中使用静态变量和方法.但是,当我尝试通过调用静态函数初始化静态变量时,编译器不喜欢它(我在下面的示例中得到错误'使用未解析的标识符getDefaultString').这是一个演示我的问题的片段:
import Foundation
public class Settings {
private static var _bundle = NSBundle.mainBundle()
static func getDefaultString(key: String) -> String {
return _bundle.objectForInfoDictionaryKey(key) as! String
}
private static var _server = getDefaultString("DefaultServer")
public class var server: String {
get { return _server }
set { _server = newValue }
}
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解为什么我不能这样做吗?
对于早期版本的Swift,这个问题已经得到了解答,但是我想知道如何在Swift 2的类中添加"for ... in"支持.看起来在新版本的Swift中已经有了足够的变化来制作答案明显不同.例如,您现在应该使用AnyGenerator协议?