通常,您需要编写如下代码:
if someOptional != nil {
// do something with the unwrapped someOptional e.g.
someFunction(someOptional!)
}
Run Code Online (Sandbox Code Playgroud)
这似乎有点冗长,而且我听说使用!
强制解包操作符可能是不安全的,最好避免使用.有没有更好的方法来处理这个?
我正在尝试使用NSUserDefaults保存数组然后加载数组,但是我得到错误"无法推断出泛型参数的参数".有什么我做错了吗?似乎没有人在swift中遇到这个问题,所以我找不到任何解决方案.
IBAction func loadData(sender: AnyObject) {
if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {
self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array
}
}
Run Code Online (Sandbox Code Playgroud) 所以我刚刚升级到Xcode 6.3 Beta 3,并且出现了很多与以下内容相关的错误:
Initializer不会覆盖其超类中的指定初始值设定项.
override init() {
super.init()
}
Run Code Online (Sandbox Code Playgroud)
例如,这是一个UIButton
类:
class CustomButton: UIButton {
var target: AnyObject!
var selector: Selector!
var action: (() -> Void)!
override init() { // Initializer does not override a designated initializer from its superclass
super.init() // Must call a designated initializer of the superclass 'UIButton'
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的UIViewController
课程之一:
class CustomAlertView: UIViewController {
required init(coder aDecoder: …
Run Code Online (Sandbox Code Playgroud) 我有一个A
符合Equatable
协议和实现==
功能的类.在子类中,B
我==
用更多的检查覆盖.
但是,当我在两个实例数组B
(两者都有类型Array<A>
)之间进行比较时,调用==
for A
.当然,如果我改变两个阵列的类型Array<B>
,==
对于B
被调用.
我提出了以下解决方案:
A.swift:
internal func ==(lhs: A, rhs: A) -> Bool {
if lhs is B && rhs is B {
return lhs as! B == rhs as! B
}
return ...
}
Run Code Online (Sandbox Code Playgroud)
这看起来很丑陋,必须扩展到每个子类A
.有没有办法确保==
首先调用子类?
考虑我编写的以下查找函数,即使用选项和可选绑定,如果在字典中找不到键,则报告消息
func lookUp<T:Equatable>(key:T , dictionary:[T:T]) -> T? {
for i in dictionary.keys {
if i == key{
return dictionary[i]
}
}
return nil
}
let dict = ["JO":"Jordan",
"UAE":"United Arab Emirates",
"USA":"United States Of America"
]
if let a = lookUp( "JO",dictionary:dict ) {
print(a) // prints Jordan
} else {
print("cant find value")
}
Run Code Online (Sandbox Code Playgroud)
我已经重写了下面的代码,但这一次,使用错误处理,保护语句,删除-> T?
和编写符合以下内容的枚举ErrorType
:
enum lookUpErrors : ErrorType {
case noSuchKeyInDictionary
}
func lookUpThrows<T:Equatable>(key:T , dic:[T:T])throws {
for i in dic.keys{
guard i …
Run Code Online (Sandbox Code Playgroud) 所以我在我的Xcode项目中有这个小算法,它不再有效 - 它告诉我,无论我尝试什么,我都无法将数字添加到另一个数字.
注意:
在将目标更改为iOS 7.0之前,一切都运行良好.
我不知道这与它有什么关系,但即使我把它切换回iOS 8它也给了我一个错误,我的构建失败了.
码:
var delayCounter = 100000
for loop in 0...loopNumber {
let redDelay: NSTimeInterval = NSTimeInterval(arc4random_uniform(100000) + delayCounter) / 30000
let blueDelay: NSTimeInterval = NSTimeInterval(arc4random_uniform(100000) + delayCounter) / 30000
let yellowDelay: NSTimeInterval = NSTimeInterval(arc4random_uniform(100000) + delayCounter) / 30000
let greenDelay: NSTimeInterval = NSTimeInterval(arc4random_uniform(100000) + delayCounter) / 30000
}
Run Code Online (Sandbox Code Playgroud) 我不明白为什么程序员extension
在他们的类实现中使用关键字.您可以阅读其他主题,然后代码在语义上更加分离等等.但是当我使用自己的代码时,我觉得使用它会更清晰// MARK - Something
.然后当你在Xcode中使用方法列表(ctrl + 6)时,一切都会在第一眼看到.
在Apple文档中,您可以阅读:
"扩展程序为现有的类,结构或枚举类型添加了新功能."
那么为什么不直接在我自己的类中编写我自己的代码呢?不像我想扩展一些外国类的功能,比如,NSURLSession
或者Dictionary
,你必须使用扩展.
Mattt Thompson在他的Alamofire图书馆中使用扩展,也许他可以给我一点解释,为什么他选择这种方法.
我有一个映射到Swift的C函数定义为:
func swe_set_eph_path(path: UnsafeMutablePointer<Int8>) -> Void
Run Code Online (Sandbox Code Playgroud)
我试图传递一个路径到该功能,并尝试过:
var path = [Int8](count: 1024, repeatedValue: 0);
for i in 0...NSBundle.mainBundle().bundlePath.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)-1
{
var range = i..<i+1
path[i] = String.toInt(NSBundle.mainBundle().bundlePath[range])
}
println("\(path)")
swe_set_ephe_path(&path)
Run Code Online (Sandbox Code Playgroud)
但在路径[i]行我得到错误:
'subscript'不可用:不能使用Int范围下标String
swe_set_ephe_path(NSBundle.mainBundle().bundlePath)
Run Code Online (Sandbox Code Playgroud)
也不
swe_set_ephe_path(&NSBundle.mainBundle().bundlePath)
Run Code Online (Sandbox Code Playgroud)
也不工作
除了没有工作,我觉得必须有一个更好,更少复杂的方式来做到这一点.使用CString的StackOverflow以前的答案似乎不再起作用了.有什么建议?
今天我用Swift 1.2更新了xcode我的代码在Swift 1.1上工作得很好但是当我更新时我得到了这个错误:
'Set'没有名为'anyObject'的成员
这是我的代码:
override public func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
let location:CGPoint? = touches.anyObject()?.locationInView(self)
if let loc = location {
if (!CGRectContainsPoint(ScaleRect(self.bounds, n: 2.0), loc)) {
self.highlighted = false
}
}
}
Run Code Online (Sandbox Code Playgroud)
你们有一个想法,我该如何解决这个问题?
我正在尝试编写一个函数,它接受一个变量指针和一个描述符/键,并为变量设置一个新值.理想情况下,指针应该是对象或基元,但我也可以使用单独的函数(或其他参数).在我的代码中,我也使用键从数据库中检索新值,但在下面的示例中,我使用虚拟值对其进行了简化,以便可以在操场中轻松使用:
import UIKit
func setValue(inout object: AnyObject, key: String) {
switch key {
case "String":
object = "A String"
case "UIColor":
object = UIColor.whiteColor()
case "Bool":
object = true
default:
println("Unhandled key: \(key)")
}
}
var string: String = "Default String"
var color: UIColor = UIColor.blackColor()
var bool: Bool = false
setValue(&string, "String")
setValue(&color, "UIColor")
setValue(&bool, "Bool")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"无法使用类型'的参数列表调用'setValue'(inout String,key String)'"
我知道我在这里混合了对象和原始.我也尝试将其分解并将它们分成两个函数,但即便失败:
func setValue(inout object: AnyObject, key: String) {
switch key {
case "UIColor":
object = UIColor.whiteColor()
default:
println("Unhandled key: …
Run Code Online (Sandbox Code Playgroud)