我试图将泛型类型的变量标记为弱:
class X<T> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
如果我没有提出任何约束T我得到错误weak cannot be applied to non-class type 'T'.
如果我只使用这个与NSObject派生类,这将工作:
class X<T: NSObject> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
但我也希望能够使用纯Swift类.
对于协议,可以通过使用class关键字要求实现者具有类类型:
protocol ClassType: class {
}
Run Code Online (Sandbox Code Playgroud)
根据ClassType协议,我现在可以将变量标记为弱:
class X<T: ClassType> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
但我不能class直接将关键字添加到泛型参数:
class X<T: class> { // Compile error
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:
extension NSObject: ClassType {
}
Run Code Online (Sandbox Code Playgroud)
但是对于纯Swift类,我没有可以添加此扩展的常见超类.有没有办法让这项工作没有将ClassType协议添加到我想要使用X该类的每个类?例如,泛型参数的一些特殊限定符如class X<T:ThisIsAClass> …
在Swift中,它是如何AnyObject支持下标的,即使对于不可下载的类型也是如此?例:
let numbers: AnyObject = [11, 22, 33]
numbers[0] // returns 11
let prices: AnyObject = ["Bread": 3.49, "Pencil": 0.5]
prices["Bread"] // returns 3.49
let number: AnyObject = 5
number[0] // return nil
let number: AnyObject = Int(5)
number[0] // return nil
Run Code Online (Sandbox Code Playgroud)
然而,如果我number被声明为Int那么这是一个语法错误:
let number: Int = 5
number[0] // won't compile
Run Code Online (Sandbox Code Playgroud)
有趣的是,Any没有下标支持.
我想从个人资料字典中获取地址,但我收到错误"输入任何内容?没有下标成员"
var address:[[String : Any]] = [["Address": "someLocation", "City": "ABC","Zip" : 123],["Address": "someLocation", "City": "DEF","Zip" : 456]]
var profile:[String : Any] = ["Name": "Mir", "Age": 10, "Addresses": address]
profile["Addresses"][0] <-----------------type any? has no subscript members
Run Code Online (Sandbox Code Playgroud)
我该如何解决并获取地址?非常感谢.
我们如何在swift 3中将anyobject转换为字符串,在旧版本中使用它非常容易.
var str = toString(AnyObject)
Run Code Online (Sandbox Code Playgroud)
我试过String(AnyObject)但输出总是可选的,即使我确定AnyObject不是可选值.
这个问题的灵感来自mz2关于检查对象类型失败并且"不是类型"错误的问题的答案.
考虑一个空的Swift类:
class MyClass { }
Run Code Online (Sandbox Code Playgroud)
试图NSObjectProtocol在此类的实例上调用任何方法将导致编译时错误:
let obj = MyClass()
obj.isKindOfClass(MyClass.self) // Error: Value of type 'MyClass' has no member 'isKindOfClass'
Run Code Online (Sandbox Code Playgroud)
但是,如果我将实例转换为AnyObject,我的对象现在符合NSObjectProtocol,我可以调用协议定义的实例方法:
let obj: AnyObject = MyClass()
obj.isKindOfClass(MyClass.self) // true
obj.conformsToProtocol(NSObjectProtocol) // true
obj.isKindOfClass(NSObject.self) // false
Run Code Online (Sandbox Code Playgroud)
我的对象不继承NSObject,但仍然符合NSObjectProtocol.怎么AnyObject符合NSObjectProtocol?
我想为我的项目创建一个这样的方法:
func print(obj: AnyObject) {
if let rect = obj as? CGRect {
println(NSStringFromCGRect(rect))
}
else if let size = obj as? CGSize {
println(NSStringFromCGSize(size))
}
//...
}
Run Code Online (Sandbox Code Playgroud)
但我不能因为CGRect和CGSize是structS和不符合AnyObject protocol.那么,关于如何做到这一点的任何想法?
我在'Dictionary'上创建了一个扩展来帮助我解析JSON.下面的方法帮助我这样做:
func toJSONString() -> String? {
if let dict = self as? AnyObject {
if let data = try? JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: 0)) {
if let json = String(data: data, encoding: String.Encoding.utf8) {
return json
}
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
问题出现在这一行:
if let dict = self as? AnyObject {
Run Code Online (Sandbox Code Playgroud)
我收到一条警告,说"检查选项时使用的'AnyObject'类型的非可选表达式"
我该如何解决这个问题?
有两种情况让我在使用Xcode 7.1开发swift 2.2时感到困惑,请看下面的例子,谢谢
首先,当导入Foundation时,我声明了一个testArray,它包含两个项目,一个Integer类型1和一个String类型"hello",我的问题是为什么Swift类型推断testArray到Array(NSObject)而不是Array(Any)
import Foundation
let testArray = [1, "hello"]
print(testArray.dynamicType) //testArray is Array<NSObject>
Run Code Online (Sandbox Code Playgroud)
其次,当我删除import Foundation时,下面的代码无法编译,错误信息是"表达式的类型没有更多内容",我的问题是为什么Swift在这种情况下没有对Array(Any)进行类型推断,谢谢求助
let testArray2 = [2, "world"]
print(testArray2)
//can't compile, error message = "Type of expression is ambiguous without more content"
Run Code Online (Sandbox Code Playgroud) 你好StackOverflow :)
自从升级到Swift 2.0以来,我一直遇到一个奇怪的问题
我正在尝试设置边框颜色,所以我正在写self.layer.borderColor = borderColor as! CGColorborderColor是一个AnyObject,而self.layer.borderColor是一个CGColor?
如果我写self.layer.borderColor = borderColor as! CGColor我得到警告
将强制向下转换为“ CGColor”作为可选选项将永远不会产生“ nil”
并建议改为使用 as?
如果我改写self.layer.borderColor = borderColor as? CGColor我会得到错误
有条件地向下转换为CoreFoundation类型“ CGColor”将始终成功
为了确保我没有丢失我也尝试写的东西container.layer.borderColor = borderColor as CGColor,container.layer.borderColor = borderColor这两个都给出了以下错误:
'AnyObject'不能转换为'CGColor';您是要使用“ as!”吗?强迫垂头丧气?
仅在使用时使用XCode给出的警告运行as!并不十分糟糕,但我希望保持我的代码警告自由。我真的很需要您的帮助。这是我不了解的东西,还是我应该报告的Swift 2.0中的错误。
干杯!
雅各布
我有一个通用结构声明如下:
struct WeakReference<T: AnyObject> {
weak var value: T?
init(value: T?) {
self.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
和一个协议:
protocol SomeProtocol: class {
}
Run Code Online (Sandbox Code Playgroud)
但我无法声明 类型的变量WeakReference<SomeProtocol>,编译器抱怨说
“WeakReference”要求是
SomeProtocol类类型
有趣的是,在 Swift 中,class是 AnyObject 的类型别名。
我实际上想保存一个数组,WeakReference<SomeProtocol>因为该数组保存强引用。
Swift 中的仅类泛型约束是一个类似的问题,但并没有真正解决这个问题。
我们如何传递SomeProtocolto WeakReference?
编辑: 以下场景编译良好,但我们失去了保存弱引用的能力:
struct Reference<T> {
var value: T?
init(value: T?) {
self.value = value
}
}
var array: [Reference<SomeProtocol>] = []
Run Code Online (Sandbox Code Playgroud)