2017-12-11 10:21:25 Vanpoe 阅读数 4697

在给Core Model 添加Entity和属性时报错:

Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor

修改一下编译的语言:swift--->OC



swift set
2016-03-23 14:55:14 yeshennet 阅读数 280

--------------------------------

As of Swift 1.2 (Xcode 6.3 beta), Swift has a native set type. From the release notes:

A new Set data structure is included which provides a generic collection of unique elements, with full value semantics. It bridges with NSSet, providing functionality analogous to Arrayand Dictionary.

Here are some simple usage examples:

// Create set from array literal:
var set = Set([1, 2, 3, 2, 1])

// Add single elements:
set.insert(4)
set.insert(3)

// Add multiple elements:
set.unionInPlace([ 4, 5, 6 ])

// Remove single element:
set.remove(2)

// Remove multiple elements:
set.subtractInPlace([ 6, 7 ])

print(set) // [5, 3, 1, 4]

// Test membership:
if set.contains(5) {
    print("yes")
}

but there are far more methods available.

Update: Sets are now also documented in the "Collection Types" chapter of the Swift documentation.


from: http://stackoverflow.com/questions/25246571/what-is-a-equivalent-of-hashset-java-in-swift

-------------------------------------


文/PPPPPPMST(简书作者)
原文链接:http://www.jianshu.com/p/ee9d6490aea0
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

字典(dictionary)、数组(array)、集合(set)区别:

  1. 字典特性:元素不重复、存储无序、元素类型可不同
  2. 数组特性:元素可重复、存储有序、元素类型均相同
  3. 集合特性:元素不重复、存储无序、元素类型均相同

Set 类型语法前瞻

1.类型
Set<Element>,其中Element为集合存入元素的类型,例如Int、String等,注意集合是没有简写方式。
2.创建方式
var letters = Set<Character>()初始化一个空集合。由于字母表中字母均不重复,类型均为Character,没有特别强调有序还是无序,因此使用集合非常合适。
3.插入元素
letters.insert("a"),往集合中插入"a"字母,再次调用想要插入第二个字母“a”无用,原因在于集合内元素不可重复特性。
4.清空集合
和数组一样,使用letters = []方式即可清空集合内所有元素。
5.使用字面量数组创建集合
如果每一次都循规蹈矩使用Set<Element>()创建一个空数组,然后逐个插入元素就显得繁琐了。Swift自然也考虑到了,提供了如下捷径:

//1
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
//2
var favoriteGenres2:Set<String> = ["Rock", "Classical", "Hip hop","Hip hop"]

注意初始方法和数组很相像,1和2的区别还在于2中“Hip hop”重复了2次,秉着集合元素不可重复特性,因此1、2两个集合最后初始化的结果是一样,均为{"Rock", "Classical", "Hip hop"}。

对了Swift是动态语言,因此即使你未指明集合元素的类型,它也能帮你推断出来,例如这么写var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

Set 操作

假设集合名字默认为setName。

  1. 获取集合内元素个数。调用 setName.count,其中count为只读变量。
  2. 检查集合是否为空。调用setName.isEmpty,返回true 或 false。
  3. 向集合中插入一个元素。调用setName.insert(element),其中element假定为一个符合集合的元素。
  4. 从集合中删除一个元素。调用setName.remove(element),如何要删除的元素存在,则从集合中删除该元素,且返回删除的元素(自身);倘若元素不存在,则返回nil。
  5. 删除集合内所有元素。调用setName.removeAll()或者setName = []均可。
  6. 检查集合是否包含某个元素。调用setName.contains(Element),返回true 或 false。
  7. 遍历整个集合。前文说到集合是无序的,因此在遍历的时候输出元素顺序不定,例如["Rock", "Classical", "Hip hop"]集合可能输出顺序是这样的:Classical -> Rock -> Hip hop,也有可能是Hip hop -> Classical -> Rock,所以别指望它循规蹈矩。
    for element in setName{
    //因为Set也是一个CollectionType 所以对数组的操作 它都适用
    }
    倘若想要有序遍历,请使用for element in setName.sort(){},先进行sort整理,后遍历的方式。

补集、交集、并集

数学中我们曾学习过对集合的操作,包括求两个集合的补集、交集、并集。如下图


无须自己实现,Swift已经提供了相关API,我们所以要做的是学习如何操作这些API即可,当然你有兴趣可以深挖下。

先简单介绍下上图中的四个集合操作:

  • intersect(_:)方法。求集合a和b的交集。
  • exclusiveOr(_:)方法。求一个集合,其内元素为a或b集合中元素,但不能同属a和b。
  • union(_:)方法。求集合a和b的并集。
  • subtract(_:)方法。求集合a-b的差集,即新集合元素只包含a中元素,不包含b中元素。

官方文档提供了一个例子,奇数集合oddDigits、偶数集合evenDigits和素数集合singleDigitPrimeNumbers,注意集合内元素均是独一无二的。

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sort()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersect(evenDigits).sort()
// []
oddDigits.subtract(singleDigitPrimeNumbers).sort()
// [1, 9]
oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort()
// [1, 2, 9]




2018-04-03 00:15:57 qq_30211165 阅读数 243
 let Userdefault = UserDefaults.standard;

//存


        //存
        Userdefault.set(true, forKey: "isSwitchState");
        //Userdefault.set("sssss字符串", forKey: "string");
        Userdefault.synchronize();

//取

  let isswitch = Userdefault.bool(forKey: "isSwitchState");
        //let string = Userdefault.url(forKey: "string");
2015-01-09 16:26:39 cg1991130 阅读数 11946

       上一话我们把ViewController类中的信息用Model来展示,那么新一话我们来尝试页面间传值。首先来回顾一下我们现在工程里类的结构,如图:


之前的做法是主页面点击每一行在新打开的页面中显示一个小黄人的表情和一个自定义的tableView.现在我们修改一下跳转页面的控制器,也就是DetailViewController这个类,上一话中我们创建了一个名为RestModel,现在我们要在跳转的页面中使用这个Model中的信息,所以在DetailViewController这个类中新建一个Rest的实例,且是全局的

var rest = Rest?()

第一步是修改跳转后的页面的图片信息,在之前显示图片的地方进行修改,改成如下格式:

var restSingle :Rest {
        set(newRest){
            if cgImageView == nil {
            cgImageView = UIImageView(frame: CGRectMake(0, 65, 320, 250))
            }
            cgImageView?.image = UIImage(named: newRest.image)
            cgImageView?.contentMode = UIViewContentMode.ScaleAspectFit
            self.view.addSubview(cgImageView!)

        }
        get {
        return rest!
        }
    
    }

注意我们之前返回的是一个String类型的图片名称,现在我们要返回的是一个Data Model的实例,在ViewController中调用显示的时候也需要修改,在我们使用NavigationController进行push操作的地方,修改之前的代码如下:

var tempRest = restArray[indexPath.row]
            detail.restSingle = tempRest

在DetailViewController中如果要修改图片下方的tableView,方法跟之前的差不多,我们先定义一个新类用来显示,命名为DetailTableViewCell,代码如下

import UIKit

class DetailTableViewCell: UITableViewCell {
    
    var keyLabel: UILabel!
    var valueLabel: UILabel!
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        keyLabel = UILabel(frame: CGRectMake(14, 7, 100, 40))
        self.contentView.addSubview(keyLabel)
        valueLabel = UILabel(frame: CGRectMake(100, 4, 184, 40))
        self.contentView.addSubview(valueLabel)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

可以看到我们使用了更简便的写法,每一行显示的都是一个键值对,而具体显示什么与行数有关,DetailViewController的代码如下:

import UIKit
var cgImageView = UIImageView?()
var rest = Rest?()
class DetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    
    var restSingle :Rest {
        set(newRest){
            if cgImageView == nil {
            cgImageView = UIImageView(frame: CGRectMake(0, 65, 320, 250))
            }
            cgImageView?.image = UIImage(named: newRest.image)
            cgImageView?.contentMode = UIViewContentMode.ScaleAspectFit
            self.view.addSubview(cgImageView!)
            rest = newRest
        }
        get {
        return rest!
        }
    
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
        var tableY:CGFloat = 250
        var tableHeight:CGFloat = 233
        
        let tableView = UITableView(frame: CGRectMake(0, tableY, 320, tableHeight), style: .Plain)
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let indentfier = "detailCell"
        var cell = DetailTableViewCell (style: .Default, reuseIdentifier: indentfier)
        switch indexPath.row {
        case 0:
            cell.keyLabel.text = "Name"
            cell.valueLabel.text = rest?.name
        case 1:
            cell.keyLabel.text = "Type"
            cell.valueLabel.text = rest?.type
        case 2:
            cell.keyLabel.text = "Location"
            cell.valueLabel.text = rest?.location
        case 3:
            cell.keyLabel.text = "Be here"
            let here = (rest?.isVisit != nil) ? "Yes,I'm here" : "No"
            cell.valueLabel.text = here
        default:
            break
        }
        return cell
    }



}
Rest是Data Model,我们上一话介绍过了,在这再贴一下Rest的代码:

class Rest: NSObject {
    var name: String = ""
    var image: String = ""
    var location: String = ""
    var type: String = ""
    var isVisit: Bool = false
    init(name: String,image: String,location: String,type: String,isVisit: Bool){
    
    self.name = name
    self.image = image
    self.location = location
    self.type = type
    self.isVisit = isVisit
    }
}

可以看到我们得代码一一对应起来了,现在来展示一下效果图,这里不再展示主页面的代码,以一话主要是用来展示使用导航控制器来控制页面跳转,主页面效果如图:

当我们点击其中某一行的时候,比如点击第一行,跳转页面如下:


为了让我们的导航栏更加醒目,我们把它的颜色换成橘红色,这是全局的设置,所以要回到AppDelegate类中,在我们调用Navigation类的application方法中进行设置,代码如下:

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
       let  navController = UINavigationController(rootViewController: ViewController())
        self.window?.rootViewController = navController
        self.window?.makeKeyAndVisible() //设置可见
        UINavigationBar.appearance().tintColor = UIColor.whiteColor()
        UINavigationBar.appearance().barTintColor = UIColor(red: 231.0/255.0, green: 95.0/255.0, blue: 53.0/255.0, alpha: 0.3)
        let color: UIColor = UIColor.whiteColor()
        let font: UIFont = UIFont(name: "AvenirNextCondensed-DemiBold", size: 22.0)!
        UINavigationBar.appearance().titleTextAttributes = [
            NSForegroundColorAttributeName:color,
            NSFontAttributeName:font
        ]
        
        return true
    }
运行效果如下图:


如果我们觉得跳转后的界面的返回按钮不够简洁的话,可以在ViewController类中的viewDidLoad方法中设置清除字符串,代码如下:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

效果如图:



2016-06-16 13:53:57 cdanx 阅读数 264

First app with core data

  • model data you want to store in Core Data using Xcode's model editor
  • add new records to Core Data
  • fetch a set of records from Core Data; and 
  • display the fetched results to the user in a table view
Add a Table View Controller and embed a navigator controller  :






Saving step:


func saveName(name: String) {
//1
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

//2
let entity = NSEntityDescription.entityForName("Person",
inManagedObjectContext:managedContext)
let person = NSManagedObject(entity: entity!,
insertIntoManagedObjectContext: managedContext)

//3
person.setValue(name, forKey: "name")
//4
do {
try managedContext.save()

//5
people.append(person)
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
}



Fetching step:

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//1
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

//2
let fetchRequest = NSFetchRequest(entityName: "Person")
//3
do {
let results =
try managedContext.executeFetchRequest(fetchRequest)
people = results as! [NSManagedObject]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}

}



//=======================================================================================================

TableviewController.swift 


//
//  TableViewController.swift
//  HitList
//
//  Created by Ricky Choi on 16/6/11.
//  Copyright © 2016年 worm. All rights reserved.
//


import UIKit
import CoreData


class TableViewController: UITableViewController {


    @IBAction func addName(sender: AnyObject) {
        var alert = UIAlertController(title: "Adding Name", message: "Please input a Name", preferredStyle: UIAlertControllerStyle.Alert)
        
        let saveAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.Default) { (action: UIAlertAction) in
            let textField = alert.textFields![0] as UITextField
            
            //self.names.append(textField.text!)
            //self.tableView.reloadData()
            
            self.saveName(textField.text!)
            
            
            //animate
            let indexPath = NSIndexPath(forRow: self.people.count - 1, inSection: 0)
            self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        }
        
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default) { (action: UIAlertAction) in
            
        }
        
        alert.addAction(saveAction)
        alert.addAction(cancelAction)
        
        alert.addTextFieldWithConfigurationHandler { (textfield: UITextField) in
            
        }
        
        self.presentViewController(alert, animated: true) { 
            
        }
        
    }
    
    func saveName(text: String) {
        //1 application delegate
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        
        let managedObjectContents = appDelegate.managedObjectContext
        
        //2 create a entity
        let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContents)
        
        let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedObjectContents)
        
        //3. save text value to  person
        person.setValue(text, forKey: "name")
        
        //4 save entity to mananged object context
        //var error: NSError?
        do {
            try managedObjectContents.save()
            //5 save to array , update UI
            people.append(person)
        } catch {
        
            let nserror = error as NSError
            print("Can not save \(nserror),\(nserror.userInfo)")
        }
        
        //if (managedObjectContents.save(&error) == nil) {
        //    print("Can not save \(error),\(error?.userInfo)")
        //}
        
        //5 save to array, update UI
        //people.append(person)
        
    }
    
    //store name array
    var names = [String]()
    //core data object
    var people = [NSManagedObject]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "Name List"
        
        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false


        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }


    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        //1 application delegate
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        
        let managedObjectContents = appDelegate.managedObjectContext
        
        //2 create a fetch request
        let fetchRequest = NSFetchRequest(entityName: "Person")
        
        //3 run request
        do {
            let fetchRequest = try managedObjectContents.executeFetchRequest(fetchRequest) as! [NSManagedObject]
            people = fetchRequest
            self.tableView.reloadData()
        } catch {
            let nserror = error as NSError
            print("Can not Fetch \(nserror),\(nserror.userInfo)")
        }
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    // MARK: - Table view data source


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        //return 0
        //return names.count
        return people.count
    }


    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
        
        // Configure the cell...
        //cell.textLabel?.text = names[indexPath.row]
        let person = people[indexPath.row]
        cell.textLabel?.text = person.valueForKey("name") as! String
        return cell
    }
    


    /*
    // Override to support conditional editing of the table view.
    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }
    */


    /*
    // Override to support editing the table view.
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            // Delete the row from the data source
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        } else if editingStyle == .Insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }    
    }
    */


    /*
    // Override to support rearranging the table view.
    override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {


    }
    */


    /*
    // Override to support conditional rearranging of the table view.
    override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the item to be re-orderable.
        return true
    }
    */


    /*
    // MARK: - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */


}

没有更多推荐了,返回首页